Здесь пример
#include <iostream>
using namespace std;
int main()
{
int x = 0;
cout << (x == 0 ? x++ : x) << endl; //operator in branch
cout << "x=" << x << endl;
cout << (x == 1 || --x == 0 ? 1 : 2) << endl; //operator in condition
cout << "x=" << x << endl;
return 0;
}
выход:
0
x=1
1
x=1
Я понимаю вывод, но это поведение undefined или нет? Гарантирован ли порядок оценки в любом случае?
Даже если это гарантировано, я уверен, что использование increment/decment может быстро стать проблемой для удобочитаемости. Я только спрашиваю, как я видел аналогичный код, и сразу был не уверен, учитывая, что существует множество примеров двусмысленного / undefined использования операторов increment/decment, таких как...
-
С++ не определяет порядок оценки параметров функции. ↪
int nValue = Add(x, ++x);
-
Язык С++ говорит, что вы не можете изменять переменную более одного раза между точками последовательности. ↪
x = ++y + y++
-
Поскольку операторы increment and decment имеют побочные эффекты, использование выражений с операторами увеличения или уменьшения в макропроцессоре может иметь нежелательные результаты. ↪
#define max(a,b) ((a)<(b))?(b):(a) k = max( ++i, j );