【问题标题】:Explain the output? [duplicate]解释输出? [复制]
【发布时间】:2014-11-29 14:46:00
【问题描述】:
#include<stdio.h>

int main()
{
int a = 10;

printf("%d %d %d",++a,a++,a--);

return 0;
}

我稍微编辑了代码..现在输出是:11 9 10 现在更复杂了..

【问题讨论】:

  • 你认为为什么会这样?什么不清楚?
  • 解释:未定义的行为

标签: c increment decrement


【解决方案1】:

取决于编译器评估函数调用参数的顺序。


如果编译器从左到右(这将解释您的输出):

  • a 是 10
  • prä-increment 表示 a 递增(值 11 作为参数传递)
  • post-decrement 表示 a 稍后 递减(值 11 作为参数传递)
  • 后增量表示a稍后增加(值 10 作为参数传递)

但是如果我编译这个,例如使用另一个编译器,我可以获得不同的输出。

【讨论】:

  • 错了。提示:序列点。
【解决方案2】:

改写如下可能更容易理解:

注意:我假设编译器会生成代码来从左到右评估参数!这可能是特定于编译器的。

#include<stdio.h>
int main()
{
    int a = 10;
    int param2, param3, param4;

    param2 = ++a;  // increments a to 11 and evaluates to 11
    param3 = a--;  // evaluates to current value of a then decrements a (11)
    param4 = a++;  // evaluates to current value of a then increments a (10)

    printf("%d %d %d",param2,param3,param4);

    return 0;
}

【讨论】:

    【解决方案3】:

    increment(++)和decrement(--)操作符的位置很重要。因此,在 ++a 的情况下,值从 10 增加到 11,然后打印,对于 a-- 打印当前值,即 10,然后将 a 递增到 11。类似地,在最后一种情况下,打印 a++ 当前值 11 并且它增加到 12。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多