Порядок вычисления оператора C++
Чтобы выяснить, что произошло с выражением "i++ + i++ + i++ + i++", я написал тестовую программу, как показано ниже.
скомпилируйте его с g++ 4.6.3 и запустите эту программу под Ubuntu 12.04, результат:
построить 3 построить 7 построить 12 построить 18 построить новое значение позвони я ++ за 18 позвони я ++ на 12 позвони я ++ на 7 позвони я ++ для 3 звоните + для 3 и 7 звоните + на 10 и 12 звоните + для 22 и 18 i1++ + i2++ + i3++ + i4++: 4 8 13 19 40 построить 3 позвони я ++ для 3 звоните в i ++ для 4 позвони я ++ на 5 позвони я ++ на 6 звоните + на 6 и 5 звоните + на 11 и 4 звоните + для 15 и 3 i++ + i++ + i++ + i++: 7 18 х 7 хх 12
с контрастом результатов из тестового примера один и два с использованием Int
тип, который я определил, я предсказал, что тестовый пример три должен напечатать x 7 xx 18
, но это не так.
мой вопрос как объяснить результат?
2 ответа
Точка последовательности определяет любую точку выполнения компьютерной программы, при которой гарантируется, что все побочные эффекты предыдущих оценок будут выполнены, и никаких побочных эффектов от последующих оценок еще не было выполнено. Они часто упоминаются в ссылках на C и C++, потому что результат некоторых выражений может зависеть от порядка вычисления их подвыражений.
Здесь есть две точки последовательности в i++(первая) и i++(вторая). И Стандарт говорит:
"Между предыдущей и следующей точкой последовательности скалярному объекту должно быть изменено его сохраненное значение не более одного раза путем оценки выражения".
Так что, если вы попытаетесь изменить значения переменной между двумя точками последовательности, это приведет к неопределенному поведению.
Ссылка Wiki для Очков Последовательности http://en.wikipedia.org/wiki/Sequence_point
Выражение формы i++ + i++
будет иметь компилятор-зависимый результат. Порядок оценки не очень хорошо определен стандартом, поэтому мы называем это неопределенным поведением.