val1、val2、val3、val4的值是如何计算出来的?
How are the values of val1, val2, val3, val4 calculated?
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
or
操作,||
,当任一侧为 1 或两侧均为 1 时为 1。
and
运算,&&
,仅当两边都是1时才为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
逻辑运算符优先级
! 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
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
or
操作,||
,当任一侧为 1 或两侧均为 1 时为 1。
and
运算,&&
,仅当两边都是1时才为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
逻辑运算符优先级
! 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