1.2, Аноним (-), 00:13, 17/05/2007 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Народ!
Объясите, почему, если i = 5, то
++i + ++i
даёт 14??
Ведь как я понимаю (пошагово)
1)++i даёт 6
2)затем 6 складывается с ++i,
а т.к. ++i увеличит значение i до выполнения какой-либо другой операции, то получается, что 6 складывается с (6 + 1).
Должно тогда получаться 13??
А все говорят: 14.
Объясните С-новичку :( | |
|
2.3, Acron (?), 01:05, 17/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
>>а т.к. ++i увеличит значение i до выполнения какой-либо другой операции, то получается, что 6 складывается с (6 + 1)
не 6, а i складывается с (6+1).
А 6+1 и есть i. Следовательно, в итоге имеем: 7+7=14
i первая и i вторая это одна и та же ячейка памяти. | |
2.4, Xan (??), 01:38, 17/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
Что, опять эта задачка?
Причина в том, что компилятор использует оптимизацию с помощью регистров.
volatile int i = 5;
решит эту проблему и результат будет по стандарту - 13. | |
|
3.6, Anton (??), 03:18, 17/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
Не надо людям мозги пудрить. Не разбираешься - молчи лучше... "Оптимизация с помощью регистров" ровно как и "volatile" здесь абсолютно не к месту. А к месту здесь стандарт C++, который утверждает следующее:
Chapter 5 Expressions
...
4 Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified.58) 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. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined. [ Example:
i = v[i ++]; / / the behavior is undefined
i = 7 , i++ , i ++; / / i becomes 9
i = ++i + 1; / / the behavior is undefined
i = i + 1; / / the value of i is incremented
—end example ]
Так что поведение в данном случае не определено, и никаких гарантий по поводу результата быть не может. | |
|
2.7, Ф (?), 10:55, 17/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
в с++ временное значение в выражении возвращает по ссылке, а не по значению.
а по стандарту - это не определенное поведение
| |
2.11, blob (??), 12:38, 20/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
Почему? Вы работаете с ОДНОЙ ячейкой памяти. правильный ответ == 14. Неужели Вы этого не видите :) | |
|
1.5, horsh (??), 03:01, 17/05/2007 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Вот кусок стандарта. На присваивании сиквенс поинт отсутствует, равно как
и на +, ++. В данных случаях только на точке с запятой.
6.5 Expressions
...
2 Between the previous and next sequence point an object shall have its stored value modified AT MOST ONCE by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.71)
...
71) This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a[i] = i;
| |
|
2.9, Xumorist (?), 00:06, 19/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
Да уж - в постах о выходе компилятора обсуждают прикол с bash.org.ru :-D
Пацтулом :) | |
|
3.10, Ламер (??), 13:13, 19/05/2007 [^] [^^] [^^^] [ответить]
| +/– |
>Да уж - в постах о выходе компилятора обсуждают прикол с bash.org.ru
>:-D
>Пацтулом :)
Кстати, этот прикол не на одном форуме программеров сейчас обсуждается. :)
| |
|
|
1.12, Аноним (-), 18:20, 18/06/2007 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Для того, чтобы понять, надо стать компилятором.
1) Пробелы убрали
2) Слева направо делаем разбор выражения
а) ++i это префисный инкремент ++i == 6
б) затем два плисика подряд это постфиксный инкркмент i++ == 7
в) затем еще плюс это, наконец, сложение i+i 7 + 7 == 14 | |
|