Я недавно столкнулся с чем-то, что, как мне показалось, я сразу понял, но, размышляя об этом больше, мне хотелось бы понять, почему это работает так, как работает.
Рассмотрим код ниже. (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