编译器如何读取这些表达式?为什么我会得到这些输出(所有变量都初始化为 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
是左边的一个,这对 &&
没有任何意义 - 你仍然需要评估右侧以查看最终结果;如果右侧为假,则结果为假,否则为真。所以在这种情况下,左侧和右侧都会被评估。 x
和 y
的值增加。
3) 同样在第三种情况下,由于短路,涉及 y
和 z
的右侧永远不会执行(因为 x
的值为 1)-因此 y
和 z
的值为 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 )...
现在的情况是,如果 a
是 null
,则不会计算右侧,并且不会取消引用 a
。
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
是左边的一个,这对 &&
没有任何意义 - 你仍然需要评估右侧以查看最终结果;如果右侧为假,则结果为假,否则为真。所以在这种情况下,左侧和右侧都会被评估。 x
和 y
的值增加。
3) 同样在第三种情况下,由于短路,涉及 y
和 z
的右侧永远不会执行(因为 x
的值为 1)-因此 y
和 z
的值为 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 )...
现在的情况是,如果 a
是 null
,则不会计算右侧,并且不会取消引用 a
。