![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
Не могу врубится, почему данное выражение приводит к результату 14...
|
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
а какому результату оно должно приводить? Все правильно. 2 раза проинкрементировал. 7 + 7 = 14.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Думаю с точки зрения раскрутки и очередности операций все правильно:
1-е действие: инкремент i. Результат помещается в i (6) 2-е действие: инкремент i. Результат помещается в i (7) 3-е действие Берется значение i (7) И прибавляется к значению i(7) - результат 14. А вот с точки зрения здравого смысла - судить не берусь. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Это UB. Результат может быть любым
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
http://en.wikipedia.org/wiki/Undefined_behavior
даже три варианта уже есть. но с там же успехом может быть и значение, например 666 Это сообщение отредактировал(а) Daevaorn - 10.5.2007, 15:27 |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Это стопудовый UB. Даже у Страуструпа четко прописано.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Разве может быть абсолютно любое? Я считал, что только в рамках последовательности операций. И у Страуструпа по-моему именно так и описывается: последовательность зависит от реализации. Но меньше 11 результат быть не может, так же как и больше 14. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
да какая разница, абсолютно любое или какое то из определенного множества, в любом случае использовать такой код нельзя. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Налетели! Согласен я, естественно, просто из врожденной вредности: не любое, а из перечня (псевдо) неправильных результатов - вот я и занудствую. ![]() Проехали. Вывод: Так делать нельзя. (Таракан без ног не слышит!) |
||||
|
|||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
Фу, зардражают такие вопросики, неужели такая белиберда важна при реализации настоящей программы???
|
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Ну почему белиберда? Не будешь знать об этом, обязательно где-нибудь что-то подобное напишешь (для "оптимизации" например, или чтоб код короче был), и будет такая программа потом работать только по полнолуниям ![]() -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
Да ну его, я таким бредом заниматся не буду
![]() И все же вернемся к вопросу. Я тут покумекал, и выходит, так ++i; // i==6 ++i;// i==7 i+i// i==13... но с компилятором не поспоришь... это наверное как необьяснимое чудо |
|||
|
||||
Hurricane |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
Как это у тебя 7+7=13 получается - не понимаю ![]() Ну решил компилятор делать сложение после второго инкремента - такая у него логика. На самом деле - важно понимать, что это UB и избегать таких неоднозначностей, а не пытаться объяснить, почему данная реализация компилятора делает так, а не иначе в этом случае. |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
не гони! Читай внимательно!!!
![]() ![]() Добавлено через 1 минуту и 8 секунд Так это все зависит от компилятора??? ![]() Добавлено через 1 минуту и 50 секунд UB - Universal Baran? |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
ага ![]() Undefined Behavior Это сообщение отредактировал(а) nickless - 10.5.2007, 19:55 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
Объяснение не сложное. Выражение ++i + ++i. Нарушает правило которое гласит, что нельзя модифицировать переменную зажатую между 2-мя точками следования более 1-го раза. Это ведет к UB. Здесь я так понимаю 1-я точка находится перед выражением, 2-я после. Если сильно приперло, то можно переписать это выражение с использованием функции.
Такой вариант всегда вернет ожидаемое. Т.к каждая ф-я обрамлена точками следования. Хотя порядок вычисления слагаемых все-равно не определен. |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
Раз все пришли к такомы выводу, то будет правильным сказать тем, кто дает такие вопросы на тестах на приеме на работу (не будем говорить кто
![]() ![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Ну неопределенное поведение. То есть ни компилятор, ни стандарт не гарантируют тебе любого правила, по которому твое выражение будет вычислено. В общем, такого надо избегать. |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
А мне кажется, что состояние UB надо на уровне компиляции присваивать ошибку!
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
turboNOMAD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.1.2007 Репутация: нет Всего: нет |
А можно ткнуть меня носом в компилеры, которые тут выдают че-то другое, кроме 14? Самому лень искать
|
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Было бы неплохо, но пожалуй сложно в реализации. Во всяком случае gcc выдаёт варнинг если компилировать с -Wall -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
это как? |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
||||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
it_medved, "проверка на вшивость"? Эта тема уже поднималась, implementation-defined
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
|
|||
|
||||
turboNOMAD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.1.2007 Репутация: нет Всего: нет |
C# тоже, как известно, выдает 13. Я имел в виду сиплюсовые компиляторы ;) |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
quote=nickless, 10.5.2007, 21:37, post1129056]$ g++ -Wall -o bla bla.cpp
bla.cpp: In function ‘int main()’: bla.cpp:18: warning: operation on ‘i’ may be undefined bla.cpp:18: warning: operation on ‘i’ may be undefined[/quote] Просто замечательно! Я сам не пробовал, но варнинг - это уже хорошо. По крайней мере, есть предупреждение. |
|||
|
||||
smartov |
|
|||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: нет Всего: 259 |
nerezus, у меня перл выдал 14. Perl 5.8.8 Linux
Проверил на других языках PHP, Javascript, (и как сказали C#) - 13 |
|||
|
||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Господа, я не претендую на хорошее знание сей, но ткните меня носом в UB.
UB у нас будет в случае использования постфиксного инкремента, когда переменная для последующих операций берется по значению. В случае же префиксного инкремента результат операции инкремента всегда будет возвращен по ссылке. Приоритет инкремента всегда выше сложения (не путайте с унарной операцией +). Следовательно результат данного выражения в C/C++ гарантирован. Пожалуйста, поправьте, мне самому стало интересно ![]() -------------------- Теперь при чем :P |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ignat, по-моему именно эту ссылочку уже приводили, но всё же:
http://www.research.att.com/~bs/bs_faq2.html#undefined - из хоум пйдж Бьярни Строуструпа. Добавлено через 4 минуты и 55 секунд
|
|||
|
||||
_stranger_ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 3.10.2006 Где: город-герой Киев Репутация: 2 Всего: 2 |
и еще дополнение к вышесказанному:
ISO/IEC 14882 C++ 5. Expressions. Clause 4
перевод на русский: между последовательными точками исполнения скалярный объект может меняться не более одного раза в результате вычисления выражения. ... Иначе результат не определен (UB). |
|||
|
||||
Hurricane |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
Это можно как-то гарантировать? ![]() Это сообщение отредактировал(а) Hurricane - 11.5.2007, 19:29 |
|||
|
||||
Promitheus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2007 Репутация: 1 Всего: 1 |
Может быть они в С++ всё так и задумали. Идём слева направо встречаем ++i, меняем содержимое на +1 , далее встречаем +, смотрим , что далее ++i у него больше приоритет, выполняем его, далее встречаем +, но за ним ++i - выполняем. А потом уже выполняем сложение, но в качестве аргументов не значение числовое, а значание которое находится по адресу в памяти у переменной i. Т.е. при выполнении операций он запоминает не числовое значение, а указатель на область памяти, а потом выполняет с этими указателями операции более низкого приоритета. Это то, как мне видется такое поведение компилятора. Впринципе, нечего необычного в поведении нету. Это чисто мои догадки, как на самом деле реализовано, я естественно не знаю. На асме бы всё это надо написать.... мож понятнее будет. |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Я не понимаю, ну зачем зря гадать что получится, написано UB, значит UB.
Конечно в каждом компиляторе это как-то реализовано, и в польшинстве случаев он выдаст один и тот же результат, но это абсолютно не гарантирует, что результат не будет другим со включеной оптимизацией, после изменения кода в другом файле проекта, с новой версией компилятора или после внезапного лунного затмения. Нравится плясать с бубном? -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
я пошел еще дальше, и установил следующие факты:
Мне кажется, что компилятор интерпретирует выражение "+ ++i" как "прибавить 12" Завтра попробую продолжить эксперименты. PS Шутка ![]() PPS Наврал, в последнем не 48 получается, придется искать другое объяснение... Это сообщение отредактировал(а) zkv - 11.5.2007, 19:56 |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Да ну. Ты уверен? На вскидку - после компайла MinGW и запуска, получаем 22 ![]() Андефинед бехаувер и всё! Хватит собственные варианты придумывать! Есть стандарт, который чётко определяет, что мы должны и когда получить. И он определяет, что в данной ситуации мы можем получить, что угодно. Всё! |
|||
|
||||
Hurricane |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
![]() Ай лайк йор джёрмен аксент! ![]() |
|||
|
||||
Promitheus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 28.3.2007 Репутация: 1 Всего: 1 |
Любитель,
В 6 Билдере прям в конструктор формы затолкай и откомпили, посмотришь, что получится - 24. __ Ну вообще да это какое-то шаманство ... i=++i + ++i + ++i + ++i + ++i; полтос выдаёт ![]() |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Млин, уже обсудили. В билдере - 24, в MinGW - 22. Где-нибудь 23. Теоритечески может получится, скажем 115. Это будет формально удовлетворять стандарту, ибо по стандарту неизвестно, что должно получиться.
![]() А как правильно произносить? А то интересно стало ![]() А так - ракладки лень переключать ![]() |
|||
|
||||
EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
//это уже на BrainFuck смахивает )))))
Я знал, что без скобочек такое писать нельзя, но думал, что можно так (++i) + (++i); ![]() -------------------- <удалено администрацией форума> |
|||
|
||||
Hurricane |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
![]() Ну, по последним указаниям ЦК ВЦСПС что-то вроде Андифайнд Бихейвьёр. ![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Насколько мне позволяет мой английский - "андефайнед бихавиэр" |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Наверное, у всех временное помешательство, то ли звезды так расположены, то ли... На нескольких форумах в одно и то же время обсуждают одну и ту же тему... Бррр... Вы проточки следования что-нибудь слышали?
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
[offtop]
На behavior у меня почему-то звук не открывается ![]() Мои преогромнейшие извинения за тягчайшее нарушение правил инглиш спикинг ![]() [/offtop] |
|||
|
||||
Hurricane |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
![]() Молодец! ![]() ![]()
Любитель, ну это же шутка была... ![]() Все, обещаю больше не хулиганить с оффтопами. |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Занимательно. Но это теория. А то, что обсуждаемое выражение приводит к UB, и так уже выяснили. |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
эээ... а я типа серьёзно говорю что ли ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |