Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

++i + ++i

271
11 мая 2007 года
MrXaK
721 / / 31.12.2002
народ, тема может уже была где-то я хз))
башорг обновился))
объясните, почему в си
 
Код:
int i = 5;
i = ++i + ++i;

i = 14
а в пхп
 
Код:
$i = 5;
$i = ++$i + ++$i;

i = 13)
по идее 13 и должно быть... чё в си не так? ))
271
11 мая 2007 года
MrXaK
721 / / 31.12.2002
а, туплю, гугл помог, топик клоз и удалите
394
11 мая 2007 года
MegaMozg
317 / / 18.03.2006
Сам разобрался, объясни/покажи, что читал другим =)
271
11 мая 2007 года
MrXaK
721 / / 31.12.2002
В С++ пред-инкремент выполняется, как и положено пред-инкременту, ДО вычисления выражения:
1) прибавить единицу к i
2) прибавить единицу к i
3) получить левое слагаемое
4) получить правое слагаемое
5) сложить оба
3
11 мая 2007 года
Green
4.8K / / 20.01.2000
Цитата: Mr.Hacker
В С++ пред-инкремент выполняется, как и положено пред-инкременту, ДО вычисления выражения:
1) прибавить единицу к i
2) прибавить единицу к i
3) получить левое слагаемое
4) получить правое слагаемое
5) сложить оба


Ответ не верный!
В C++ если модифицировать одну переменную дважды не пересекая точку следования (в данном случае точка с запятой), то это ведет к undefined behavior.
Поэтому такие конструкции писать НЕЛЬЗЯ, т.к. разные компиляторы будут воспринимать их по-разному.

271
11 мая 2007 года
MrXaK
721 / / 31.12.2002
а почему тогда данный код компилится и работает?)
по идее берётся оператор +, потом вычисляется ++i слева, ++i справа и складываются
3
11 мая 2007 года
Green
4.8K / / 20.01.2000
Компилиться и работает - ещё не значит правильный код.
Ты понимаешь понятие "undefined behavior"?
Смотри стандарт.
271
11 мая 2007 года
MrXaK
721 / / 31.12.2002
ммм, ну как я понимаю, это использование переменной до её инициализации и т. п... а про В C++ если модифицировать одну переменную дважды не пересекая точку следования не знал..
271
12 мая 2007 года
MrXaK
721 / / 31.12.2002
Green, а скажи, вот в принципе код асмовый
movl $0x5,0xfffffffc(%ebp)
incl 0xfffffffc(%ebp)
incl 0xfffffffc(%ebp)
mov 0xfffffffc(%ebp),%eax
add %eax,0xfffffffc(%ebp)
где здесь неопределённость??
3
12 мая 2007 года
Green
4.8K / / 20.01.2000
Неопределенность в C++, а не в ассемблере. Цитирую
Цитата: Green

Поэтому такие конструкции писать НЕЛЬЗЯ, т.к. разные компиляторы будут воспринимать их по-разному.


Причем тут вообще ассемблер? Ты на ассемблере этот код пишешь или на C++?

А неопределенность, вот она:

Цитата: Mr.Hacker

по идее 13 и должно быть... чё в си не так? ))


или вот:

Цитата: Mr.Hacker

1) прибавить единицу к i
2) прибавить единицу к i К какому i? К 5 или уже к 6?
3) получить левое слагаемое А какое именно? Которое было на шаге 1 или 2?
4) получить правое слагаемое А какое именно? Которое было на шаге 1 или 2?
5) сложить оба Оба каких? 6 и 7 или 7 и 7 ?


Кстати

Цитата: Mr.Hacker
В С++ пред-инкремент выполняется, как и положено пред-инкременту, ДО вычисления выражения:


тоже неверное утверждение.
1. Порядок вычисления аргументов неопределен.
2. Как префиксные, так и постфиксные операции будут сделаны до вычисления всего выражения.

271
12 мая 2007 года
MrXaK
721 / / 31.12.2002
насчёт асма: 4 компилятора(bcc3, bcc5, gcc, intel) такой код сгенерили... поэтому и подумал... лан, понял в принципе)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог