PDA

Просмотр полной версии : стандарты С++, компиляторы, и i++ i ++


Йоха
13.01.2011, 08:59
Хороший тест, только вот ответ на вопрос .:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)) ::.

Кот ДаWINчи
13.01.2011, 09:42
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)) ::.
Вот этого и добиваемся! Если засунул строчку в компилятор, то уже хоть чего то может....

zergtmn
13.01.2011, 11:59
Хороший тест, только вот ответ на вопрос чему будет равно выражение i = 5; i = ++i + ++i вычислит любой школьльник засунув эту строчку в компилятор, а вот смысл скорее всего останется недоступным.
Один засунет в один компилятор, другой - в другой, а ответы получатся разные.

Йоха
13.01.2011, 12:23
если другой компилятор выдаст другой ответ, то это плохой компилятор

virusav
13.01.2011, 13:07
Это форум по мангосу, а не программированию на си++.
Тест должен содержать вопросы относительно тематики форума.

zergtmn
13.01.2011, 13:25
если другой компилятор выдаст другой ответ, то это плохой компилятор
А как определить какой хороший?
Про такое понятие, как Undefined Behaviour, не слышали?
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)) ::.

virusav
13.01.2011, 14:23
Не надо такие вопросы включать в тест, это уже идет тематика программирования.

Йоха
13.01.2011, 14:32
И как определить язык, на котором написано


Сперва не понял о чем речь. :mda:
Действительно в вопросе не указано для какого языка это выражение. Видимо подразумевается что претенденты на получение форумного аккаунта должны знать на каком языке написан мангос =)))

Йоха
14.01.2011, 09:38
у меня нет претензий к вопросом за исключением одного, насчет вычислить выражение i = 5; i = ++i + ++i.
Там просто необходимо добавить предложение что это "выражение на языке с++"

rsa
14.01.2011, 10:12
Lordronn
только последний кое-как хоть куда-то проходит. Остальные мимо кассы вообще. :)
это бы еще ладно, а вот то что ответы на них вполне неоднозначны - это еще хуже ;) кто изобрел бомбу до сих пор непонятно, углы треугольника в неэвклидовой геометрии совершенно другие, да и наименьшей неделимой частицы по самым свежим теориям в списке нету... и вообще частиц не существует, как известно из волновой теории ;)

Добавлено через 5 минут
у меня нет претензий к вопросом за исключением одного, насчет вычислить выражение i = 5; i = ++i + ++i.
Там просто необходимо добавить предложение что это "выражение на языке с++"

нет такого понятия. правильно будет "на языке с++ в соотвествии со стандартом ANSI???. есть реализации языка в которых вычисление такого выражения вернет совсем не то что предполагается (там ведется атомизация операций и результат будет .:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 12 сообщение(ий)) ::.).

alien
14.01.2011, 13:57
у меня нет претензий к вопросом за исключением одного, насчет вычислить выражение i = 5; i = ++i + ++i.
Там просто необходимо добавить предложение что это "выражение на языке
с++"
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 1 сообщение(ий)) ::.

Йоха
14.01.2011, 19:21
нет такого понятия. правильно будет "на языке с++ в соотвествии со стандартом ANSI???. есть реализации языка в которых вычисление такого выражения вернет совсем не то что предполагается (там ведется атомизация операций ).

да блин, если компилятор с++ выдает тут нечто .:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::., выкинуть на хрен такой компилятор. Это же элементарное выражение. Префиксная форма оператора ++ увеличивает значение переменной до вычисления значения всего выражения, это четко прописано в стандарте.

Йоха
14.01.2011, 19:45
ну и как вариант:

.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 2 сообщение(ий)) ::.

rsa
14.01.2011, 21:05
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::.

Йоха
14.01.2011, 22:31
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::.
и ... ?
может быть ты считаешь что турбос с дискетки 90-ых является тем самым компилятором на который стоит ровняться ?

Или ты считаешь что он "честно в соответствии с объявленной последовательной логикой выполнения выдает" правильный результат ?

Лезем в ТОТ САМЫЙ стандарт, что для языка с, что для с++ там есть такая фраза:
The value of the operand of the prefix ++ operator is incremented. The result is the new
value of the operand after incrementation.

.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::. гениально не правда ли ? Каким боком там товарисчи из борланда писали компиляторы никому неизвестно ...

Для случаев как с тс я уже написал :
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::.

zergtmn
15.01.2011, 00:38
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 13 сообщение(ий)) ::.

RomanRom2
15.01.2011, 12:14
гениально не правда ли ? Каким боком там товарисчи из борланда писали компиляторы никому неизвестно ...
мы с munche в свое время убедились в этом сами. сишный компилятор борланда почти в половине случаев не соответствует либо стандартам, либо общепринятой документации. я имею ввиду, например, не соответствие составных типов в функциях с другими языками, с тем же си из вижуал студии и документации msdn. что то мы там в сетевом коде делали. и... плюнули. в дельфи все нормально с этим, ни одной жалобы еще не поступало :)

Вот отличное предложение (жаль я его заметил не сразу, ну я тупой). Кто-то может сформулировать такие (подобные) вопросы-ответы под мангос?
отправил в личку.

добавлено:

и ... ?
может быть ты считаешь что турбос с дискетки 90-ых является тем самым компилятором на который стоит ровняться ?
Лезем в ТОТ САМЫЙ стандарт, что для языка с, что для с++ там есть такая фраза:

Цитата:
The value of the operand of the prefix ++ operator is incremented. The result is the new
value of the operand after incrementation.

йоха, блин :) не вводи людей в заблуждение :)
в твоей же цитате написано "The result is the new value of the operand after incrementation". ++i не переменную возвращает, а значение. "tC, 90-затертого года" выдал правильный результат.

Йоха
15.01.2011, 18:37
йоха, блин :) не вводи людей в заблуждение :)
в твоей же цитате написано "The result is the new value of the operand after incrementation". ++i не переменную возвращает, а значение. "tC, 90-затертого года" выдал правильный результат.

Рома, заблуждаешься ты. оператор ++ возвращает переменную, а не ее значение.

Народ, вы неверно понимаете смысл оператора ++. Он не возвращает значение! Он увеличивает значение переменной и возвращает ее. И в зависимости от формы (префиксная или постфиксная) значение переменной увеличивается до вычисления выражения или после.
В нашем случае сперва значение переменной i увеличивается на единицу два раза, а потом происходит сложение переменной с самой собой.

Базовый синтаксис префиксного оператора ++ в ввиде функции-члена класса:

T &T::operator ++(T&)

Что он возвращает ? правильно! экземпляр класса по ссылке, то есть тот же экземпляр который уже увеличен, а постфиксный возвращает копию. За счет этого и достигается требуемый эффект.

P.S. турбо с в топку !

P.P.S учите матчасть !

rsa
15.01.2011, 20:12
*** скрытый текст ***
и ... ?
может быть ты считаешь что турбос с дискетки 90-ых является тем самым компилятором на который стоит ровняться ?

мне достаточно пофиг правильно это или нет. могу только сказать, поскольку асм еще помню, что трансляция того выражения в машкоды гораздо проще, логичнее и быстрее в том варианте, .:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 13 сообщение(ий)) ::. ;)

Добавлено через 3 минуты
Форум открыт на чтение, тогда-уж сразу на "ниже-пояса" их дублируйте, чтоб им не копипастить.
с моей точки зрения умение найти ответ на этом же форуме, а не в гугле, уже вполне достойная заявка.

zergtmn
15.01.2011, 20:41
Специально для Йоха:
Стандарт C99, параграф 6.5 "Expressions"
2. Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored. 71)
Сноска:
71) This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a[i] = i;

Стандарт С++ (Working Draft)
Chapter 5 Expressions
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions,
and the order in which side effects take place, is unspecified.58) Between the previous and next sequence point a
scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior
value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for
each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined.

i = v[i ++]; / / the behavior is undefined
i = 7 , i++ , i ++; / / i becomes 9
i = ++ i + 1; / / the behavior is undefined
i = i + 1; / / the value of i is incremented

О чем я и говорил с самого начала.
Кому-то не мешало бы подучить матчасть. Или хотя бы на самом деле заглянуть в стандарт.

RomanRom2
16.01.2011, 03:02
Рома, заблуждаешься ты. оператор ++ возвращает переменную, а не ее значение.
P.P.S учите матчасть !
ох йоха йоха, ты чото все поперепутал у себя в голове :)
ты же сам написал: The result is the new value of the operand after incrementation. тут написано новое ЗНАЧЕНИЕ. оператор ++ для своего класса ты можешь как угодно перегрузить, но ты ж не можешь например сделать ++i = 1, если это int. разберись с документацией.

но истина оказалась совсем не там :) мы тут посовещались с нашими гуру, говорят что так вообще некорректно делать. потому что имеются побочные эффекты, порядок выполнения которых не гарантирован.
будет сделано следующее:
1) запомнено число i
2) увеличено i
3) запомнено число i
4) увеличено i
посчитана сумма 1) и 3)
6) i присвоен результат 5)
гарантируется, что 2) выполняется после 1), 4) выполняется после 3), 5) выполняется после 1) и 3), 6) выполняется после 5), остальное не гарантируется. вроде бы даже не гарантируется, что будет "увеличено i", а не "i = результат 1) + 1". понятно, в чем проблема? нельзя делать предположения о порядке вычисления выражения (кроме || и &&, для который порядок определен). нельзя делать предположения о том, что будет выполнено раньше - присваивание или увеличение.

об этом написал чуть выше zergtmn. вот тебе еще ссылка на msdn, как раз этот случай: http://msdn.microsoft.com/en-us/library/8a425116%28v=vs.80%29.aspx

иными словами и коротко говоря - такие действия вообще не определены каким либо стандартом. zergtmn выделил это для тебя красным. вот в этом истина. в таком случае результат полностью будет зависить от компилятора и ошибкой это не будет. это будет просто отдельной интерпритацией.

но компилятор то это всё хавает... как уж так? :) да очень просто, это намеренно сделано. компилятору это разрешено делать, чтобы можно было делать всякие умные вкусные оптимизации. вообще, по рукам молотком тем, кто пишет проги, которые по-разному работают на разных компиляторах. вот зачем делать i = ++i +1? делай i += 2 и не умничай.

итак, какой бы не был результат - он всегда будет (вот парадокс) правильный :) "точка зрения" будет зависить от используемого компилятора.

кстати, покажи плиз компилятор, в котором будет равно тому, в чем ты так уверен?

Йоха
16.01.2011, 10:15
Согласен, почитал стандарт, там действительно результат подобного выражения не определен. В общем случае выражение не может содержать операторов которые изменяют операнд более одного раза. Так что результат подобных выражений целиком на совести разработчиков компилятора.

.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::.

RomanRom2
16.01.2011, 17:40
а чо, собсно. тема можно сказать закрыта :)))

tempura
16.01.2011, 18:17
Бл-лин!!!!!!!!!! Как невовремя!!! Только я попкорна набрал, в первый ряд протолкался... :)

rsa
16.01.2011, 18:20
Кстати. Тему, точнее вопрос, можно вернуть взад переформулировав:
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 14 сообщение(ий)) ::.

tempura
16.01.2011, 19:51
Кстати. Тему, точнее вопрос, можно вернуть взад переформулировав:
*** скрытый текст ***

Сделать можно только четыре варианта, и лишь один из них можно сделать верным.

rsa
16.01.2011, 21:06
Выкинуть 4 и ссылку на него :)

alien
16.01.2011, 22:33
Да и еще
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 1 сообщение(ий)) ::.

Йоха
17.01.2011, 08:42
кстати, вот хороший разбор полетов на эту тему:
http://alenacpp.blogspot.com/2005/11/sequence-points.html

tempura
17.01.2011, 21:11
...если в гугле вбить, то сразу выдает ответ О-О-О!!!!! Вот оно! Ты знал-ты знал!!!
Если человек при любом затруднении, вопросе, проблеме, сложности просто лезет в гугл и находит там ответ - это НАШ человек. А какой компилятор кому что выдает - это проблемы компилятора. :) Я вообще попробовал это калькулятором посчитать...

alien
17.01.2011, 22:00
tempura, ты меня не понял.... я не против чтобы народ пользовался гуглем. Я про то чтобы народ не бездумно копировал найденный ответ из первойже строчки.. )

KiriX
17.01.2011, 22:06
tempura, ты меня не понял.... я не против чтобы народ пользовался гуглем. Я про то чтобы народ не бездумно копировал найденный ответ из первойже строчки.. )
Ну темпура об этом и говорит вообще-то. Правильный ответ уже тот - что кто-то полез в гугле. И нашёл его там. И пофиг на компиляторы - пусть будет ответ из гугла - главное, что человек поиском при затруднении умеет пользоваться - об этом шла речь ;)

Sid
17.01.2011, 22:25
Я первым делом, подумал, мб нигма поймет синтаксис и решит :)
http://nigma.ru/?s=i+%3D+5;+i+%3D+%2B%2Bi+%2B+%2B%2Bi&t=web&rg=t%3D_c%3D%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F_&rg_view=&yn=1&gl=1&rm=1&ms=1&yh=1&av=1&ap=1&nm=1&lang=all&srt=0&sf=1

tempura
18.01.2011, 02:03
tempura, ты меня не понял.... я не против чтобы народ пользовался гуглем. Я про то чтобы народ не бездумно копировал найденный ответ из первойже строчки.. )

http://ru-mangos.ru/picture.php?albumid=1&pictureid=52

Не накаляй обстановку...