Вышел (http://gcc.gnu.org/) релиз новой ветки набора компиляторов GCC 4.2 (http://gcc.gnu.org/gcc-4.2/).
Особенности новой версии (http://gcc.gnu.org/gcc-4.2/changes.html):
- Удалена опция -fshared-data;
- В компиляторы C, C++ и Fortran добавлена поддержка техники параллельного программирования OpenMP (http://gcc.gnu.org/projects/gomp/).
- Новые опции -fstrict-overflow и -Wstrict-overflow для управления поведением при переполнении переменной;
- Новая опция -fno-toplevel-reorder отключающая перегруппировку порядка следования top-level функций, переменных и asm вставок.
- В преддверии появления в GCC 4.3 поддержки описанного в стандарте C99 метода обработки inline функций, GCC 4.2 выдает предупреждение при использовании нестатичных inline функций.
- Другие привязанные к определенным архитектурам или языкам изменения (http://gcc.gnu.org/gcc-4.2/changes.html).
URL: GCC 4.2
Новость: https://www.opennet.ru/opennews/art.shtml?num=10782
Ну наконец то в релизе нативно OpenMP, с ноября ждал!
Народ!
Объясите, почему, если i = 5, то
++i + ++i
даёт 14??
Ведь как я понимаю (пошагово)
1)++i даёт 6
2)затем 6 складывается с ++i,
а т.к. ++i увеличит значение i до выполнения какой-либо другой операции, то получается, что 6 складывается с (6 + 1).
Должно тогда получаться 13??
А все говорят: 14.
Объясните С-новичку :(
>>а т.к. ++i увеличит значение i до выполнения какой-либо другой операции, то получается, что 6 складывается с (6 + 1)
не 6, а i складывается с (6+1).
А 6+1 и есть i. Следовательно, в итоге имеем: 7+7=14
i первая и i вторая это одна и та же ячейка памяти.
Что, опять эта задачка?
Причина в том, что компилятор использует оптимизацию с помощью регистров.
volatile int i = 5;
решит эту проблему и результат будет по стандарту - 13.
Не надо людям мозги пудрить. Не разбираешься - молчи лучше... "Оптимизация с помощью регистров" ровно как и "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 ]
Так что поведение в данном случае не определено, и никаких гарантий по поводу результата быть не может.
в с++ временное значение в выражении возвращает по ссылке, а не по значению.
а по стандарту - это не определенное поведение
тоже любитель анального юмора?
http://community.livejournal.com/ru_programming/750836.html
Почему? Вы работаете с ОДНОЙ ячейкой памяти. правильный ответ == 14. Неужели Вы этого не видите :)
Вот кусок стандарта. На присваивании сиквенс поинт отсутствует, равно как
и на +, ++. В данных случаях только на точке с запятой.
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;
Да уж - в постах о выходе компилятора обсуждают прикол с bash.org.ru :-D
Пацтулом :)
>Да уж - в постах о выходе компилятора обсуждают прикол с bash.org.ru
>:-D
>Пацтулом :)Кстати, этот прикол не на одном форуме программеров сейчас обсуждается. :)
Для того, чтобы понять, надо стать компилятором.
1) Пробелы убрали
2) Слева направо делаем разбор выражения
а) ++i это префисный инкремент ++i == 6
б) затем два плисика подряд это постфиксный инкркмент i++ == 7
в) затем еще плюс это, наконец, сложение i+i 7 + 7 == 14
13 получится если поставить скобки :(++i)+(++i) == 13