编译器如何读取这些表达式?为什么我会得到这些输出(所有变量都初始化为 1)?

How does compiler read these expressions? Why am I getting these outputs(All variables are initialized as 1)?

int x = 1 , y = 1 , z = 1  ;

现在检查这些代码行:-

cout << (++x || ++y)<<endl;     //Output 1
cout << x <<" " << y;          // now x = 2 and y = 1 . Why 'y' is not incremented ?

再次将值初始化为 1

cout <<(++x && ++y )<<endl;     //Output 1
cout << x <<" " << y;         //now x = 2 and y = 2 . Why 'y' is incremented ?

再次将值初始化为 1

cout << (++x ||++y && ++z )<<endl;  //Output 1
cout << x<<" "<< y<<" "<<z ;       //now x = 2 , y = 1 , z = 1.Why these outputs? 

谁能解释一下编译器是如何读取这些代码的? 我阅读了有关优先顺序的信息,但我无法弄清楚编译器如何处理这些类型的 code.Even a 小帮助将不胜感激!

这叫短路。

1) 在第一种情况下,由于 x 左侧的值为 1,因此永远不会调用运算符 || 的右侧(因为结果在任何情况下都为真||) 的情况 - 因此 y 永远不会递增。

2) 同样在你的第二个例子中,因为 x 是左边的一个,这对 && 没有任何意义 - 你仍然需要评估右侧以查看最终结果;如果右侧为假,则结果为假,否则为真。所以在这种情况下,左侧和右侧都会被评估。 xy 的值增加。

3) 同样在第三种情况下,由于短路,涉及 yz 的右侧永远不会执行(因为 x 的值为 1)-因此 yz 的值为 1.

这里还有一些 info

我不确定您输入 ||&& 时会发生什么。这些都是逻辑 or/and 运算符。

||&& 的有趣之处在于它们的参数是惰性求值的。这称为短路。换句话说,只要编译器有足够的信息来确定表达式的最终结果,它就会停止计算参数。

cout << (++x || ++y)<<endl;

++x 被评估为布尔值 true。由于 || 一侧为真就足以使整个表达式为真,因此不计算 ++y

cout <<(++x && ++y )<<endl;

++x 仍然为真,因此编译器也会计算 ++y,就好像结果是 false,表达式将是 false.

第三个留给你自己想。

我还要补充一点,这是一个非常强大的功能。没有它,以下表达式将取消引用 null 指针:

if( a!=NULL && a->val>3 )...

现在的情况是,如果 anull,则不会计算右侧,并且不会取消引用 a