(Точки последовательности описаны в п. 5.1.2.3, как точки в выполнении, где имели место все предыдущие побочные эффекты).
но я столкнулся с чем-то, что, как мне показалось, я понял сразу, но размышляя об этом больше, мне хотелось бы понять, почему это работает так, как работает.
Рассмотрим код ниже.(x-- == 9)
явно оценивается, в то время как(y++ == 11)
не является. Моя первая мысль была такой логичной&&
запускается, видит, что выражение уже стало ложным, и запускается, прежде чем оценивать вторую часть выражения.
Чем больше я об этом думаю, тем больше я не понимаю, почему это так. Насколько я понимаю, логические операторы опускаются ниже операций приращения в порядке приоритета. не должны(y++ == 11)
оценивать, даже если общее выражение уже стало ложным?
Другими словами, не должен ли порядок операций диктовать, что(y++ == 11)
оцениваться доif
высказывание понимает, что выражение в целом будет ложным?
#include <iostream>
using namespace std;
int main( int argc, char** argv )
{
int x = 10;
int y = 10;
if( (x-- == 9) && (y++ == 11) )
{
cout << "I better not get here!" << endl;
}
cout << "Final X: " << x << endl;
cout << "Final Y: " << y << endl;
return 0;
}
Выход:
Final X: 9
Final Y: 10