![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
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. Это будет формально удовлетворять стандарту, ибо по стандарту неизвестно, что должно получиться.
![]() А как правильно произносить? А то интересно стало ![]() А так - ракладки лень переключать ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |