询问C++最高优先级运算符作用范围及指定代码输出0的原因
为什么这段C++代码输出0?
先看代码:
int a = 1, b = 2, c = 3; bool z = a >= b || b == c && !b && !!a; cout << z << endl;
要搞懂输出0的原因,得从运算符优先级和结合性入手,相关运算符的优先级从高到低排序是:!(逻辑非) > >=、==(关系运算符,优先级相同) > &&(逻辑与) > ||(逻辑或)。下面一步步拆解表达式:
第一步:处理最高优先级的!
!!a:a是1,!1结果为false(0),再取一次非!!1结果为true(1)!b:b是2,非0值取非结果为false(0)
第二步:处理关系运算符>=和==
这俩优先级相同,按左结合顺序计算:
a >= b:a=1,b=2,1>=2不成立,结果为false(0)b == c:b=2,c=3,2==3不成立,结果为false(0)
第三步:处理&&逻辑与
&&优先级比||高,所以先计算||右侧的所有&&部分:
- 先算
b == c && !b:false && false → false - 再算上面的结果和
!!a的与:false && true → false
第四步:处理||逻辑或
现在表达式简化成false || false,结果为false(0),所以变量z的值是0,输出就是0。
解答你的疑问
>=的优先级远高于||和&&,所以它只会和紧邻的左右操作数a和b结合,形成独立子表达式a >= b,不会把后面的b == c && !b && !!a作为整体和a比较。- 优先级最高的运算符(这里是
!)会作用于它右侧紧邻的单个操作数:比如!b直接作用于变量b,!!a则是先对a取非,再对这个取非的结果再次取非,是嵌套作用的。而像>=这种优先级次高的运算符,也是作用于左右紧邻的操作数,形成独立的子表达式后,再参与后续运算。
内容的提问来源于stack exchange,提问作者rebecca wong
相关产品推荐
相关产品推荐

