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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему такой результат??? 
V
    Опции темы
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   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1199 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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