【发布时间】:2015-10-25 02:16:39
【问题描述】:
我在 Windows 7 上的 Code::Blocks 10.05 中执行了以下代码。
int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);
我得到的输出如下,
a=1
b=0
c=0
由于短路评估,这非常有意义。
表达式a++ 是后增量,0 返回逻辑与 (&&)。因此,b++ 部分没有被评估,因为0 && 0 和
0 && 1 的计算结果为 0。
但是这里出现了我的疑问。运算符的优先级值清楚地表明++ 的优先级高于&&。所以我的理解是这样的,a++ 和 b++ 都被评估,然后&& 只检查表达式a++ 的结果来做出决定。但这并没有发生,只有a++ 在这里被评估。
这种行为的原因是什么? && 作为序列点是否与此行为有关?如果是这样,为什么我们说&& 的优先级低于++?
【问题讨论】:
-
在它们之上还有一条规则,a++ 只会在语句执行后递增。因此,无论它的优先级是什么,它都会在语句完成后递增。
-
哇,这是一个可恶的陷阱。
-
除了这个问题有趣的语言方面,我建议让您的代码立即清晰易读。目前情况并非如此。
-
我认为这样的代码得到了任何支持,这很可悲。
-
@saurabhagarwal
a++将在评估a和语句完成之间的某个不确定时间递增。这就是为什么你不能在同一个表达式中再次使用a(在a++之前或之后)。
标签: c operator-precedence short-circuiting