Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему такой результат??? 
V
    Опции темы
it_medved
Дата 10.5.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



Не могу врубится, почему данное выражение приводит к результату 14...

Код

    int i = 5;
    i = ++i + ++i;

PM MAIL WWW   Вверх
Fazil6
Дата 10.5.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



а какому результату оно должно приводить? Все правильно. 2 раза проинкрементировал. 7 + 7 = 14.
PM MAIL   Вверх
Anikmar
Дата 10.5.2007, 14:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Думаю с точки зрения раскрутки и очередности операций все правильно:
1-е действие:
инкремент i. Результат помещается в i (6)
2-е действие:
инкремент i. Результат помещается в i (7)
3-е действие
Берется значение i (7) И прибавляется к значению i(7) - результат 14.

А вот с точки зрения здравого смысла - судить не берусь.
PM MAIL ICQ   Вверх
Daevaorn
Дата 10.5.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Это UB. Результат может быть любым
PM MAIL WWW   Вверх
Anikmar
Дата 10.5.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Daevaorn @  10.5.2007,  15:00 Найти цитируемый пост)
Это UB. Результат может быть любым 

А что такое UB?

Результат не может быть любым.
Он может быть либо 12 либо 13 либо 14

С точки зрения здравого смысло (имхо) ожидается 13
PM MAIL ICQ   Вверх
nerezus
Дата 10.5.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

UB
 Неопределенное поведение. Зависит от реализации.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Daevaorn
Дата 10.5.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anikmar @  10.5.2007,  16:03 Найти цитируемый пост)
А что такое UB?

http://en.wikipedia.org/wiki/Undefined_behavior
Цитата(Anikmar @  10.5.2007,  16:03 Найти цитируемый пост)
Результат не может быть любым.
Он может быть либо 12 либо 13 либо 14

С точки зрения здравого смысло (имхо) ожидается 13 

даже три варианта уже есть. но с там же успехом может быть и значение, например 666

Это сообщение отредактировал(а) Daevaorn - 10.5.2007, 15:27
PM MAIL WWW   Вверх
Xenon
Дата 10.5.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Это стопудовый  UB. Даже у Страуструпа четко прописано.


--------------------
user posted image  
PM MAIL   Вверх
Anikmar
Дата 10.5.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Daevaorn @  10.5.2007,  15:11 Найти цитируемый пост)
даже три варианта уже есть. но с там же успехом может быть и заначени, например 666 

Разве может быть абсолютно любое?

Я считал, что только в рамках последовательности операций. И у Страуструпа по-моему именно так и описывается: последовательность зависит от реализации.

Но меньше 11 результат быть не может, так же как и больше 14.
PM MAIL ICQ   Вверх
zkv
Дата 10.5.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anikmar @  10.5.2007,  15:29 Найти цитируемый пост)
Разве может быть абсолютно любое?

Я считал, что только в рамках последовательности операций. И у Страуструпа по-моему именно так и описывается: последовательность зависит от реализации.

Но меньше 11 результат быть не может, так же как и больше 14. 

да какая разница, абсолютно любое или какое то из определенного множества, в любом случае использовать такой код нельзя.
PM MAIL   Вверх
Daevaorn
Дата 10.5.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anikmar @  10.5.2007,  16:29 Найти цитируемый пост)
Разве может быть абсолютно любое?

если это UB, то может быть всё что угодно. Любые варианты - это гадание на кофейной гуще.
PM MAIL WWW   Вверх
Anikmar
Дата 10.5.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zkv @  10.5.2007,  15:38 Найти цитируемый пост)
да какая разница, абсолютно любое или какое то из определенного множества, в любом случае использовать такой код нельзя. 


Цитата(Daevaorn @  10.5.2007,  15:44 Найти цитируемый пост)
если это UB, то может быть всё что угодно. Любые варианты - это гадание на кофейной гуще. 


Налетели!

Согласен я, естественно, просто из врожденной вредности: не любое, а из перечня (псевдо) неправильных результатов - вот я и занудствую.  smile 

Проехали. 

Вывод: Так делать нельзя. (Таракан без ног не слышит!)


PM MAIL ICQ   Вверх
nickless
Дата 10.5.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Stroustrup C++ Style and Technique FAQ
Даже пример тот же smile 


--------------------
user posted image

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
PM MAIL   Вверх
it_medved
  Дата 10.5.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



Фу, зардражают такие вопросики, неужели такая белиберда важна при реализации настоящей программы???
PM MAIL WWW   Вверх
nickless
Дата 10.5.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(it_medved @  10.5.2007,  17:22 Найти цитируемый пост)
неужели такая белиберда важна при реализации настоящей программы?

Ну почему белиберда? Не будешь знать об этом, обязательно где-нибудь что-то подобное напишешь (для "оптимизации" например, или чтоб код короче был), и будет такая программа потом работать только по полнолуниям smile 


--------------------
user posted image

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
PM MAIL   Вверх
it_medved
Дата 10.5.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



Да ну его, я таким бредом заниматся не буду smile 
И все же вернемся к вопросу. Я тут покумекал, и выходит, так
++i; // i==6
++i;// i==7
i+i// i==13... 
но с компилятором не поспоришь... это наверное как необьяснимое чудо
PM MAIL WWW   Вверх
Hurricane
Дата 10.5.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(it_medved @ 10.5.2007,  10:56)
Да ну его, я таким бредом заниматся не буду smile 
И все же вернемся к вопросу. Я тут покумекал, и выходит, так
++i; // i==6
++i;// i==7
i+i// i==13... 
но с компилятором не поспоришь... это наверное как необьяснимое чудо

Как это у тебя 7+7=13 получается - не понимаю  smile

Ну решил компилятор делать сложение после второго инкремента - такая у него логика.

На самом деле - важно понимать, что это UB и избегать таких неоднозначностей, а не пытаться объяснить, почему данная реализация компилятора делает так, а не иначе в этом случае.
PM MAIL   Вверх
it_medved
  Дата 10.5.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



не гони! Читай внимательно!!! smile Там 6+7 smile

Добавлено через 1 минуту и 8 секунд
Так это все зависит от компилятора??? smile

Добавлено через 1 минуту и 50 секунд
UB - Universal Baran?
PM MAIL WWW   Вверх
nickless
Дата 10.5.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(it_medved @  10.5.2007,  18:26 Найти цитируемый пост)
Universal Baran

ага smile 
Undefined Behavior

Это сообщение отредактировал(а) nickless - 10.5.2007, 19:55


--------------------
user posted image

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
PM MAIL   Вверх
dizzy1984
Дата 10.5.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Цитата(it_medved @  10.5.2007,  18:56 Найти цитируемый пост)
Да ну его, я таким бредом заниматся не буду  
И все же вернемся к вопросу. Я тут покумекал, и выходит, так
++i; // i==6
++i;// i==7
i+i// i==13... 
но с компилятором не поспоришь... это наверное как необьяснимое чудо


Объяснение не сложное.
Выражение ++i + ++i. Нарушает правило которое гласит, что нельзя модифицировать переменную зажатую между 2-мя точками следования более 1-го раза. Это ведет к UB.
Здесь я так понимаю 1-я точка находится перед выражением, 2-я после.
Если сильно приперло, то можно переписать это выражение с использованием функции.

Код

int& inci(int &i) {return ++i};

i = inci(i) + inci(i);


Такой вариант всегда вернет ожидаемое.
Т.к каждая ф-я обрамлена точками следования.
Хотя порядок вычисления слагаемых все-равно не определен.
PM MAIL   Вверх
it_medved
Дата 10.5.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



Раз все пришли к такомы выводу, то будет правильным сказать тем, кто дает такие вопросы на тестах на приеме на работу (не будем говорить кто smile), что этот вопрос неправилен, потому как результат зависит от компилятора и UB(хотя что это такое я так и не понялsmile).
PM MAIL WWW   Вверх
JackYF
Дата 10.5.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(it_medved @  10.5.2007,  20:28 Найти цитируемый пост)
UB

Ну неопределенное поведение. То есть ни компилятор, ни стандарт не гарантируют тебе любого правила, по которому твое выражение будет вычислено.

В общем, такого надо избегать.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
it_medved
Дата 10.5.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



А мне кажется, что состояние UB надо на уровне компиляции присваивать ошибку!
PM MAIL WWW   Вверх
JackYF
Дата 10.5.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(it_medved @  10.5.2007,  20:51 Найти цитируемый пост)
А мне кажется, что состояние UB надо на уровне компиляции присваивать ошибку!


а компилятор не факт, что сможет сам распознать UB. Хотя кто его знает...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
turboNOMAD
Дата 10.5.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.1.2007

Репутация: нет
Всего: нет



А можно ткнуть меня носом в компилеры, которые тут выдают че-то другое, кроме 14? Самому лень искать
PM MAIL   Вверх
nickless
Дата 10.5.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(it_medved @  10.5.2007,  19:51 Найти цитируемый пост)
А мне кажется, что состояние UB надо на уровне компиляции присваивать ошибку! 

Было бы неплохо, но пожалуй сложно в реализации. Во всяком случае gcc выдаёт варнинг если компилировать с -Wall


--------------------
user posted image

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
PM MAIL   Вверх
it_medved
Дата 10.5.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 1.5.2007
Где: Днепропетровск

Репутация: нет
Всего: 1



Цитата

Во всяком случае gcc выдаёт варнинг если компилировать с -Wall 
 
это как?
PM MAIL WWW   Вверх
nickless
Дата 10.5.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(it_medved @  10.5.2007,  20:21 Найти цитируемый пост)
это как? 

Код
$ 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



--------------------
user posted image

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
PM MAIL   Вверх
dizzy1984
Дата 10.5.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Цитата(it_medved @  10.5.2007,  20:28 Найти цитируемый пост)
хотя что это такое я так и не понял

Запускаешь свою программу, она начинает форматировать твой жесткий диск
PM MAIL   Вверх
Rockie
Дата 10.5.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



it_medved, "проверка на вшивость"? Эта тема уже поднималась, implementation-defined





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
nerezus
Дата 10.5.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

А можно ткнуть меня носом в компилеры, которые тут выдают че-то другое, кроме 14? Самому лень искать
 perl выдал 13


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
turboNOMAD
Дата 11.5.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.1.2007

Репутация: нет
Всего: нет



Цитата(nerezus @ 10.5.2007,  23:16)
perl выдал 13

C# тоже, как известно, выдает 13. Я имел в виду сиплюсовые компиляторы ;)
PM MAIL   Вверх
JackYF
Дата 11.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 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]

Просто замечательно! Я сам не пробовал, но варнинг - это уже хорошо.
По крайней мере, есть предупреждение.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
smartov
Дата 11.5.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



nerezus, у меня перл выдал 14. Perl 5.8.8 Linux 

Проверил на других языках
PHP, Javascript, (и как сказали C#) - 13
PM MAIL   Вверх
Ignat
Дата 11.5.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Господа, я не претендую на хорошее знание сей, но ткните меня носом в UB.
UB у нас будет в случае использования постфиксного инкремента, когда переменная для последующих операций берется по значению.
В случае же префиксного инкремента результат операции инкремента всегда будет возвращен по ссылке. Приоритет инкремента всегда выше сложения (не путайте с унарной операцией +). Следовательно результат данного выражения в C/C++ гарантирован.

Пожалуйста, поправьте, мне самому стало интересно smile


--------------------
Теперь при чем :P
PM   Вверх
Любитель
Дата 11.5.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Ignat, по-моему именно эту ссылочку уже приводили, но всё же:

http://www.research.att.com/~bs/bs_faq2.html#undefined - из хоум пйдж Бьярни Строуструпа.

Добавлено через 4 минуты и 55 секунд
Цитата(Bjarne Stroustrup)

int i = 10;
int j = ++i + i++;

<...>

the order of evaluation of arguments is unspecified



--------------------
PM MAIL ICQ Skype   Вверх
_stranger_
Дата 11.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: 2
Всего: 2



и еще дополнение к вышесказанному:
ISO/IEC 14882 C++
5. Expressions. Clause 4
Цитата

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. ... otherwise the behavior is undefined

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



PM MAIL   Вверх
Hurricane
Дата 11.5.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Ignat @ 11.5.2007,  10:31)
В случае же префиксного инкремента результат операции инкремента всегда будет возвращен по ссылке.

Это можно как-то гарантировать?  smile Имеется ввиду не только для int, но и возможную кривую реализацию перегруженного оператора класса. Да и для int, похоже, что одни компиляторы использую ссылку (результат 14), другие - копию (результат 13).


Это сообщение отредактировал(а) Hurricane - 11.5.2007, 19:29
PM MAIL   Вверх
Promitheus
Дата 11.5.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



Код

int i=5;
i=++i + ++i + ++i;//выдает 24


Может быть они в С++ всё так и задумали.

Идём слева направо встречаем ++i, меняем содержимое на +1 , далее встречаем +, смотрим , что далее ++i у него больше приоритет, выполняем его, далее встречаем +, но за ним ++i - выполняем. А потом уже выполняем сложение, но в качестве аргументов не значение числовое, а значание которое находится по адресу в памяти у переменной i. Т.е. при выполнении операций он запоминает не числовое значение, а указатель на область памяти, а потом выполняет с этими указателями операции более низкого приоритета. 

Это то, как мне видется такое поведение компилятора. Впринципе, нечего необычного в поведении нету. Это чисто мои догадки, как на самом деле реализовано, я естественно не знаю.

На асме бы всё это надо написать.... мож понятнее будет. 

PM MAIL ICQ   Вверх
nickless
Дата 11.5.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Я не понимаю, ну зачем зря гадать что получится, написано UB, значит UB.
Конечно в каждом компиляторе это как-то реализовано, и в польшинстве случаев он выдаст один и тот же результат, но это абсолютно не гарантирует, что результат не будет другим со включеной оптимизацией, после изменения кода в другом файле проекта, с новой версией компилятора или после внезапного лунного затмения. Нравится плясать с бубном?


--------------------
user posted image

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
PM MAIL   Вверх
zkv
Дата 11.5.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Promitheus @  11.5.2007,  19:38 Найти цитируемый пост)
int i=5;
i=++i + ++i + ++i;//выдает 24

я пошел еще дальше, и установил следующие факты:
Код

int i=5;
i=++i + ++i + ++i + ++i;//выдает 36

Код

int i=5;
i=++i + ++i + ++i + ++i + ++i;//выдает 48

Мне кажется, что компилятор интерпретирует выражение "+ ++i"  как "прибавить 12"
Завтра попробую продолжить эксперименты.

PS Шутка smile
PPS Наврал, в последнем не 48 получается, придется искать другое объяснение...

Это сообщение отредактировал(а) zkv - 11.5.2007, 19:56
PM MAIL   Вверх
Любитель
Дата 11.5.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Promitheus @  11.5.2007,  19:38 Найти цитируемый пост)
//выдает 24

Да ну. Ты уверен?

На вскидку - после компайла MinGW и запуска, получаем 22 smile

Андефинед бехаувер и всё! Хватит собственные варианты придумывать! Есть стандарт, который чётко определяет, что мы должны и когда получить. И он определяет, что в данной ситуации мы можем получить, что угодно.

Всё!


--------------------
PM MAIL ICQ Skype   Вверх
Hurricane
Дата 11.5.2007, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Любитель @ 11.5.2007,  11:52)
Андефинед бехаувер

 smile 

Ай лайк йор джёрмен аксент!  smile 
PM MAIL   Вверх
Promitheus
Дата 11.5.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



Любитель

Код

int i=5;
i=++i + ++i + ++i;
ShowMessage(i);

В 6 Билдере прям в конструктор формы затолкай и откомпили, посмотришь, что получится - 24. 
__

Ну вообще да это какое-то шаманство ...  i=++i + ++i + ++i + ++i + ++i; полтос выдаёт  smile 
PM MAIL ICQ   Вверх
Любитель
Дата 11.5.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Млин, уже обсудили. В билдере - 24, в MinGW - 22. Где-нибудь 23. Теоритечески может получится, скажем 115. Это будет формально удовлетворять стандарту, ибо по стандарту неизвестно, что должно получиться.

 smile 
Цитата(Hurricane @  11.5.2007,  19:58 Найти цитируемый пост)
Ай лайк йор джёрмен аксент!

А как правильно произносить? А то интересно стало smile

А так - ракладки лень переключать smile


--------------------
PM MAIL ICQ Skype   Вверх
EvgenZ
Дата 11.5.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



//это уже на BrainFuck смахивает )))))
Я знал, что без скобочек такое писать нельзя, но думал, что можно так
(++i) + (++i);

 smile 



--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Hurricane
Дата 11.5.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Любитель @ 11.5.2007,  12:22)
Цитата(Hurricane @  11.5.2007,  19:58 Найти цитируемый пост)
Ай лайк йор джёрмен аксент!

А как правильно произносить? А то интересно стало smile

А так - ракладки лень переключать smile

 smile 

Ну, по последним указаниям ЦК ВЦСПС что-то вроде Андифайнд Бихейвьёр.  smile Хотя жители Соединенного Королевства могут и с этим не согласиться.
PM MAIL   Вверх
JackYF
Дата 11.5.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Любитель @  11.5.2007,  20:22 Найти цитируемый пост)
А как правильно произносить? А то интересно стало


Насколько мне позволяет мой английский - "андефайнед бихавиэр"



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nickless
Дата 11.5.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Любитель @  11.5.2007,  19:22 Найти цитируемый пост)
А как правильно произносить?

 smile Раз уж на то пошло smile :
undefined
behavior




--------------------
user posted image

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
PM MAIL   Вверх
BreakPointMAN
Дата 11.5.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Наверное, у всех временное помешательство, то ли звезды так расположены, то ли... На нескольких форумах в одно и то же время обсуждают одну и ту же тему... Бррр... Вы  проточки следования что-нибудь слышали?


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Daevaorn
Дата 11.5.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(BreakPointMAN @  12.5.2007,  00:09 Найти цитируемый пост)
Вы  проточки следования что-нибудь слышали?

тут про них уже говорили
PM MAIL WWW   Вверх
Любитель
Дата 11.5.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



[offtop]
Цитата(nickless @  11.5.2007,  22:03 Найти цитируемый пост)
Раз уж на то пошло
...

На behavior у меня почему-то звук не открывается smile (туоп запрос идёт - ответа нет)...

Мои преогромнейшие извинения за тягчайшее нарушение правил инглиш спикинг smile 
[/offtop]


--------------------
PM MAIL ICQ Skype   Вверх
Hurricane
Дата 12.5.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



 smile 

Цитата(nickless @ 11.5.2007,  14:03)
Раз уж на то пошло smile :
undefined
behavior



Молодец!  smile А теперь всю фразу вместе повторить сможешь?  smile 

Цитата(Любитель @ 11.5.2007, 15:45)
Мои преогромнейшие извинения за тягчайшее нарушение правил инглиш спикинг 


Любитель, ну это же шутка была...  smile 

Все, обещаю больше не хулиганить с оффтопами.


PM MAIL   Вверх
JackYF
Дата 12.5.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(BreakPointMAN @  11.5.2007,  23:09 Найти цитируемый пост)
Бррр... Вы  проточки следования что-нибудь слышали? 


Занимательно. Но это теория. А то, что обсуждаемое выражение приводит к UB, и так уже выяснили.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 12.5.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Hurricane @  12.5.2007,  00:44 Найти цитируемый пост)
Любитель, ну это же шутка была...

эээ... а я типа серьёзно говорю что ли smile Так - делать нечего...


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2098 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.