请解释输出:
#include<iostream.h>
int main()
{
int i= -3, j=2, k=0, m;
m = ++i || ++j && ++k;
cout<< i <<" " << j << " " << k <<" "<<m;
return 0;
}
输出: -2 2 0 1
这就是我的想法: (++ i || ++ j)&amp;&amp; (++ k)//考虑优先顺序 ++我变为-2所以OR的第一部分是真的,所以它不会检查第二部分 (感谢Joachim Pileborg告诉我短路评估)
总的来说,AND的第一部分是真的。 但这还不足以使陈述真实,第二部分必须是真实的。 所以++ k使得k = 1 在这里,我弄错了。为什么k不增加?
然而,在这种情况下:
#include<iostream.h>
int main()
{
int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;
cout<< i <<" " << j << " " << k <<" "<<m;
return 0;
}
输出: 0 3 1 1
考虑到短路评估,我也得到了这个。
答案 0 :(得分:1)
让我们从这段代码开始
#include<iostream.h>
int main()
{
int i= -3, j=2, k=0, m;
m = ++i || ++j && ++k;
cout<< i <<" " << j << " " << k <<" "<<m;
return 0;
}
很明显,m
将布尔值转换为int。由于++i
等于-2且不等于零,因此不会评估所有其他表达式,因为已知整个表达式等于true
。所以在声明之后
m = ++i || ++j && ++k;
m
等于1,i
等于-2所有其他变量均未更改。
在此代码段中
#include<iostream.h>
int main()
{
int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;
cout<< i <<" " << j << " " << k <<" "<<m;
return 0;
}
++i
将等于0.因此将评估operator ||
的右操作数。这个操作数是
++j && ++k
由于++j
将等于3且不等于0,因此++k
也将被评估并且将等于1.因为operator &&
的两个操作数不相等为零,则结果等于true
因此你会得到i == 0,j == 3,k == 1,m == 1.
来自C ++标准
5.14逻辑AND运算符
1&amp;&amp;操作员组从左到右。操作数都是 在上下文中转换为bool(第4条)。如果两者都是如此 操作数是真的,否则是假的。不像&amp;,&amp;&amp;担保 从左到右的评估:如果是,则不评估第二个操作数 第一个操作数是假的。
5.15逻辑OR运算符
1 ||操作员组从左到右。操作数都是 在上下文中转换为bool(第4条)。如果有的话,它返回true 它的操作数是真的,否则是假的。与|, ||不同 保证从左到右的评估;而且,第二个操作数是 如果第一个操作数的计算结果为true,则不进行评估。
答案 1 :(得分:0)
在逻辑表达式中,例如:... || ... && ...
C ++可以省略不会改变表达式输出值的执行语句。例如:如果它计算第一个值并且它的输出不等于0,则表达式:true || ... && ...
始终为true,因此不需要执行更多表达式
答案 2 :(得分:0)
以下是你的第二个案例: -
int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;
在
( cond1 || cond2)
表达式如果cond1为true,则编译器不会继续检查cond2。仅当cond1返回false时,它才会评估cond2。
所以,在第二个++中,我将第一个表达式设为false并强制编译器继续进行进一步求值,而在第一个案例中,第一个表达式返回true。