val1,val2,val3,val4的值如何计算?

时间:2020-03-15 17:22:41

标签: c++ logical-operators

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的值?

2 个答案:

答案 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
相关问题