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