C条件声明

时间:2014-03-04 20:24:11

标签: c

我遇到了以下一段代码。

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。

我理解除了第一个输出之外的其余输出。

请帮忙。

感谢。

3 个答案:

答案 0 :(得分:2)

第一个0i的值,初始化为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在评论中所指出的,这里有两个密切相关的概念:

  1. 修复后操作符:表达式中使用的值是增量发生之前的值 ...
  2. 序列点:代码中的一个点“先前评估的所有副作用都将被执行” - 换句话说,“在我们通过这一点之前,所有需要发生的事情都会发生”。例如,当您传递序列点时,保证增加(和存储)任何修复后增加的变量。
  3. 这里的关键是三元运算符的?就是这样一个序列点 - 因此你确定i在你到达printf语句之前会减少。

    将此与以下代码进行对比:

    i = 1;
    a = 5 * i++ + (i = 2 * i--);
    

    这会导致未定义的行为 - C标准中没有任何内容能够明确告诉您ai在上述内容之后的价值。应该何时将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个值。