val1、val2、val3、val4的值是如何计算的


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

最新更新