вот оно, собственно: Код (Text): int c= 1; c= c++ + c++; и Код (Text): int c= 1; c= ++c + ++c; наю, забитая уже тема, но все же... принято считать, что стандарт не определяет результата ни одного из этих выражений, только вот я не понимаю, каким образом результирующее значение c во втором сэмплике может отличаться от 6
Есть постфикс(с++) и префикс(++с). Так вот в первом случае по стандарту будет выполнено выражение/сравнение(или любая другая операция языка, если она имеется) и только потом инкрементирование, а во втором случае сначала инкремент, а потом другие операции.
да лан, у меня их и не было )) я лучше 14882-98 посмотрю (http://www.kuzbass.ru:8086/docs/isocpp/expr.html):
про i = v[i++]; это действительно первый курс, значит, и i= i++ + i++ тоже не определен (кстати, а просто i++ + i++ определено? я в той каше по ссылке быстро потерялся)) зато i= ++i + ++i; на мой взгляд, не может быть вычислен разными способами, потому что преинкременты в любом случае выполнятся до, и вернут именующее значение. Таким образом, что значит: я тоже не понимаю
IceStudent если смотреть по ссылке: это условие здесь не выполняется а про постинкремент было сказано вот что: непонятно, что здесь понимается под "After the result is noted". Возможны два варианта развития событий: int temp= i; i++; i= v[temp]; и int temp= i; i= v[temp]; i++; насколько я понимаю, стандарт не определяет, по какому из сценарев должно вычисляться выражение
censored а можно в двух словах? а то этот стандарт читать oO sequence points - это что то вроде вызовов функций, возврата итд?
Nouzui Грубо говоря, seq. points (точки следования) это "запятые", по к-рым компилятор определяет порядок исполнения. Примерами SP являются операторы &&, ||, ?, comma, ;, etc. За глубокими знаниями -- в стандарт .
Насколько я понял, sequence points - это точки, в которых должны быть завершены все "side effects", в частности, sequence point являются вызовы функций, return, &&, ||, ?, comma, ; Кстати - ";"! значит, в i= 1 + i++; этот самый ++ может сработать в любом месте до начала следующего выражения. Это понятно. А как насчет i = ++i + 1; разве преинкремент не должен однозначно выполниться первым, ведь он возвращает ссылку на переменную, а не значение?
Nouzui А он не должен выполнятся первым - стандарт не гарантирует, что компилятор в целях оптимизации не поменяет их местами, и выполнит скажем так: i = 1; i += ++i;
Народ, смотрите, говорится же, что оператор || является sequence point, но если выполнить такое выражение Код (Text): int i=0; int j=0; int k; k = (i++) || (j++); , то получается, что k == 0. А ведь вроде все side effect'ы должны быть закончены...