【发布时间】:2014-09-15 19:54:21
【问题描述】:
我有以下代码对我产生了意想不到的结果:
#include < stdio.h >
int a = 0, value;
int main(void)
{
// Testing the evaluation order of multiple
// conditional operators:
value = (a == 3) ? 3 : (a = 3) ? 5 : 0;
printf("%d\n", value);
return 0;
}
我期待这段代码打印 3,看到条件运算符评估
从右到左,在 ? 处有一个序列点。最先被处决的人
操作,而它实际上打印 5.
假设存在于两个序列之间的表达式的副作用是错误的吗
当表达式的值是时也会计算点数吗?
如果我添加 printf("%d\n" a);不过我打印了 3 个,所以副作用就完成了。
还是只是控制剂量真正传递给子表达式 which
正式计算“第一”吗?
我宁愿赌后者,因为将 'a' 的值更改为 3 和右值
在将第二个条件分配给 4 时导致短路评估
第一个条件表达式,这意味着我为'a'和'value'都打印了3。
我使用 -std=c99 标志在带有 GCC 4.8.2 的 Lubuntu 14.04 上得到了上述结果。
感谢有人为我澄清这件事!
【问题讨论】:
-
谁说“条件运算符从右到左求值”?