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的值?
答案 0 :(得分:4)
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
or
操作||
在任意一方为1或双方均为1时为1。
仅当双方双方均为1时,and
操作&&
才为1。
假设没有括号,and
操作始终优先(在or
操作之前计算)。
如果所有运算符的优先级相同,则从左到右进行计算。
C ++使用Short-circuit evaluation表示&&
和||
的含义,并非所有步骤都需要求值(就像在一系列乘法中乘以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
答案 1 :(得分:1)
逻辑运算符优先级
! 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