原题:设int a =3;则表达式a < 1&&-- a>1的运算结果和a的值分别是()
A.0和2 B.0he 3 C.1he2 D.1he3
虽然我知道&&前面部分是错的,&&后面部分就不运行,但是--优先级是表达式里最高的,是不是先得把--a计算了,a的值为2,然后2< 1&&2>1,表达式:值0&&不考虑,最后答案不应噶是A嘛,我下载来的试题答案是B。
我的想法是错的吗。。。
C编译器在处理带&&指令的时候是很聪明的,他可不会像人一样把两边的值都算出来再给结果,事实上他会先判断&&运算符的左边表达式,一旦该值不为真,他就立刻判断结果为零,不会进行接下来的操作,所以该题编译器在看到3<1不为真时
,就会得出为0,跳过右边运算的。
表达式的执行顺序是从左往右执行的,所以先判断a<1后面的就不执行了
与门在执行的时候,前面的判断语句如果为false,后面的就不会再执行了,因此后面并没有执行。
现场验证,vs2013编译器,在编译
a < 1 && --a >1 时,
表达式a < 1 先进行求值,然后再求值表达式 --a >1。
上式的优先级最低的运算符是 && ,因此 运算符 && 是该表达式的“根”(最后计算),
又因 (表达式1)&&(表达式2)及其性质,先算表达式1,再算表达式2,
因此先计算a < 1,再计算--a >1。
上式完全展开为:(exp1 < exp2) && (--exp3 > exp4),因为&&是最后要计算的,
它的左表达式和右表达式一定最后形成,并且还要有上述的性质,因此左表达式一定先于
右表达式计算,因此有上述结果。
再来分析一下,单独的--a >1表达式,
运算符> 是该表达式的“根”,左表达式和右表达式最后形成,且没有求值顺序,因此,左右都会求值。所以,表达式--a求值(这时称运算符--优先级大),求值结果
成为>的左表达式,1成为>右表达式,然后 运算符 >求值(这时称>优先级小)。