免责声明:我不是这样的代码,我只是想了解c语言的工作原理!!!
输出为12。
该表达式(a-- == 10 && a-- == 9)
从左到右求值,并且在时a仍为10,a-- == 10
但对于而言a为9 a-- == 9
。
1)关于增加后评估的时间有明确的规定吗?从这个例子看来,它在&&之前但在==之后求值。那是因为&&逻辑运算符产生a-- == 10
一个完整的表达式,所以a执行后会被更新吗?
2)同样对于c / c ++,某些运算符(如前缀递减)从右到左出现,因此a == --a
先将a递减至9,然后将9 == 9进行比较。是否有这样的理由设计c / c ++?我知道对于Java,情况恰恰相反(它从左到右求值)。
#include <stdio.h>
int main() {
int a = 10;
if (a-- == 10 && a-- == 9)
printf("1");
a = 10;
if (a == --a)
printf("2");
return 0;
}
逻辑&&
运算符包含在第一和第二操作数的求值之间的序列点。部分原因是,--
在评估右侧之前,作为左侧一部分的任何副作用(例如操作员执行的副作用)都是完整的。
C标准的6.5.13p4节中关于逻辑AND运算符对此进行了详细说明:
与按位二进制&运算符不同,&&运算符保证从左到右的求值;如果对第二个操作数求值,则在第一个和第二个操作数的求值之间有一个序列点。如果第一个操作数比较等于0,则不评估第二个操作数。
对于此表达式:
(a-- == 10 && a-- == 9)
首先将a
(10)的当前值与10进行相等性比较。这是正确的,因此将评估右侧,但不会在左侧进行减量运算之前进行评估a
。然后,a
比较(现在为9)的当前值与9的相等性。这也是正确的,因此整个表达式的计算结果为true。在执行下一条语句之前a
,已完成了在右侧执行的递减副作用。
但是此表达式:
if (a == --a)
涉及a
在没有序列点的情况下以相同的表达式进行读写。这会调用未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句