Сергей Тарасов
Профессор
Да, Intel C Compiler.
Злая вещь.
Злая вещь.
вот вот! все из php гуру превртились в C++ гуру! сегодя что полнолуние?за что люблю эту тему - всегда вызовет оживленное обсуждение =)
=)(5+1+1)+((5+1+1)+1) = 14
dark-demonкороче там undefined behaviour, но скорее всего будет 14. с примитивами просто иначе довольно трудно сделать
смотри.
1. порядок вычисления аргументов функции не определен, но все параметры вычисляются до входа в функцию.
2. собсна сам вход в функцию и выход из нее - это т.н. sequence point, это момент когда гарантируется, что все side effects, от операций в этом выражении случились (eng. completed).
3. ; - это тоже sequence point.
4. side effects - это: вызовы библиотечных функций, и запись в volatile переменные, ++(примитив) - тоже в общем-то сюда попадает.
5. сообщается, что если переменная модифицируется дважды между sequence point-ами, то результат вычисления выражения неопределен, на самом деле не только выражения, а вообще всей программы.
++i - это load + inc + store, их два, seq point-ов между ними нет => undefined behavoiur, компилятор волен хоть код для полета на луну сгенерить.
да, отличаются, т.к. для myclass - это вызов функции со всеми последствиями, т.е. два дополнительных sequence point-а (см. выше про них).или по твоему
code:
int i; ++i;
чем-то принципиально отличается от
code:
myclass i; ++i;
?
этот пункт позволяет компилятору в общем-то творить все что угодно в предположении, что переменная меняется всего раз между любыми "смежными" sequence point-ами. т.е. например сначала расклонировать значение по двум кусочкам sse регистра, потом сделать xadd для обеих за одну инструкцию, а потом передать в функцию (с предпологаемой оптимизацией - функция прям из sse регистра эти значения и заберет), т.е. результат будет вообще 12Except 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.53) 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:
—end example]Код:i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented