我遇到了以下一段代码。
int main()
{
int i=1,j=2;
int a=i--?printf("%d",i):j--;
printf(" %d %d %d",i,j, a);
return 0;
}
输出为0 0 2 1。
我理解除了第一个输出之外的其余输出。
请帮忙。
感谢。
答案 0 :(得分:2)
第一个0
是i
的值,初始化为1
,然后在第二行递减。
更明确地说:
i = 1
(i--) - evaluates as True, then sets i to 0
printf("%d ", i) = prints '0'
j-- - skipped
printf("%d %d %d", i, j, a)
print i: 0
print j: 2 (unchanged)
print a: return value of first `printf` : character count (1)
正如@tristopia在评论中所指出的,这里有两个密切相关的概念:
这里的关键是三元运算符的?
就是这样一个序列点 - 因此你确定i
在你到达printf
语句之前会减少。
将此与以下代码进行对比:
i = 1;
a = 5 * i++ + (i = 2 * i--);
这会导致未定义的行为 - C标准中没有任何内容能够明确告诉您a
或i
在上述内容之后的价值。应该何时将i++
的值存回i
?在减量运作之前?我们将结果分配给i
的事实如何?这是在其他“隐式存储”操作之前还是之后?大多数编译器会在遇到这样的行时发出警告 - 如果你有特定的操作顺序,你应该通过重写代码“强制序列点”。
答案 1 :(得分:2)
i的值在对其进行条件检查之前不会减少(由于后缀减少)。当i为1时,测试结果为true,导致printf执行。但正如i的测试结束一样,它会减少,这就是printf在屏幕上打印的内容。
答案 2 :(得分:1)
嗯,你打电话给printf()
两次。条件运算符中的第一个打印值i
(0)。当您创建变量a
时,它的默认值为0,i
在使用i--
递减后变为0,因此条件已通过。
然后你有第二个printf()
再次打印i
以及其他2个值。