#include <iostream>
using namespace std;
int main()
{
int a = 8;
cout << "ANDing integer 'a' with 'true' :" << a && true;
return 0;
}
该程序为什么输出8
而不输出1
(对于true
)?
答案 0 :(得分:8)
如果查看operator precedence,您会发现左移运算符<<
的优先级高于逻辑AND运算符&&
。
因此,其评估为:
(cout << "ANDing integer 'a' with 'true' :" << a) && true;
显示8。
答案 1 :(得分:4)
逻辑AND运算符&&
用于表达式。
计算第一个表达式。
如果第一个表达式为假,则不再进行求值。
否则,将评估第二个表达式。
接下来,返回两个布尔表达式的结果。
因此,第一个表达式被求值:
cout << "ANDing integer 'a' with 'true' :" << a
评估的副作用是控制台输出如下:
ANDing integer 'a' with 'true' :8
生成输出是因为它是评估第一个表达式的副作用。
答案 2 :(得分:3)
首先在表达式8 && true
中对8求值(然后也进行流式处理)。评估结果为true,然后运算符返回true。但是,比8已经早已开始。如果改用(8 && true)
,则将首先对括号进行求值,并保证结果为1,然后将其进行流式处理。
这种行为称为Operator Precedence-描述操作符的执行顺序(在您的情况下为&&
和<<
)。
答案 3 :(得分:2)
逻辑AND运算符&&
用于表达式。如果两者都为true,则返回true和false。
cout << "ANDing integer 'a' with 'true' :" << a && true;
被评估为:
(cout << "ANDing integer 'a' with 'true' :" << a) && true;
由于运算符优先级(<<
的优先级高于AND &&
)
给您打印以下内容:8
如果我们进行以下更改:(a && true);
它会为您打印以下内容:1