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