int main(){
int a = 1, b = 0, c = 1, val1, val2, val3, val4;
val1 = a || b || c;
val2 = a && b && c;
val3 = a || b && c;
val4 = a && b || c;
cout<< val1 << val2 << val3 << val4;
return 0;
}
val1到val4的值是如何计算的?
val1 = a || b || c = (1 or 0) or 1 = 1 or 1 = 1
val2 = a && b && c = (1 and 0) and 1 = 0 and 1 = 0
val3 = a || b && c = 1 or (0 and 1) = 1 or 0 = 1
val4 = a && b || c = (1 and 0) or 1 = 0 or 1 = 1
当任一侧为1或两侧均为1时,or
运算||
为1。
仅当两个边都为1时,and
运算&&
才为1。
假设没有括号,and
运算总是优先(在or
运算之前计算(。
如果所有运算符的优先级相同,则从左到右进行计算。
C++对&&
和||
使用短路求值,这意味着并非所有步骤都需要求值(就像如果在一系列乘法运算中乘以0,则在不执行每次计算的情况下就知道结果为0(。
这意味着对于val2
,由于a && b
的计算结果为0,因此不需要计算c
。由于后面只有&&
运算,因此右侧必须计算为0。
这同样适用于具有||
运算符的val3
。由于a
的计算结果为1,因此不必计算b && c
。由于如果任何一个项为1(在本例中为a
(,则右侧必须计算为1。
涉及短路评估,执行的计算如下:
val1 = a || b || c = 1 or ... = 1
val2 = a && b && c = 1 and 0 and ... = 0
val3 = a || b && c = 1 or ... = 1
val4 = a && b || c = 1 and 0 or 1 = 0 or 1 = 1
要查看短路评估的效果,您可以编写一个程序,在评估变量时进行打印,如下所示:
#include <iostream>
using namespace std;
int print(int x) {
cout << x;
return x;
}
int main(){
int a = 1, b = 0, c = 1, val1, val2, val3, val4;
val1 = print(a) || print(b) || print(c);
cout << endl;
val2 = print(a) && print(b) && print(c);
cout << endl;
val3 = print(a) || print(b) && print(c);
cout << endl;
val4 = print(a) && print(b) || print(c);
cout << endl;
return 0;
}
该程序的输出为:
1
10
1
101
逻辑运算符优先
! High
&& Medium
|| Low
这是的计算
val1 = a || b || c; => 1 || 0 || 1 => 1 || 1 => 1
val2 = a && b && c; => 1 && 0 && 1 => 0 && 1 => 0
val3 = a || b && c; => 1 || 0 && 1 => 1 || 0 =>1
val4 = a && b || c; => 1 && 0 || 1 => 0 || 1 => 1