【问题标题】:Input Puzzler in C [duplicate]C中的输入拼图[重复]
【发布时间】:2010-08-17 09:00:21
【问题描述】:

可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

int main()
{
int a=5,s;
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}

输出是 7 和 14

但是

int main()
{
int a, s;
printf("Enter value of a");
scanf ("%d",&a);
s=++a + ++a;
printf("%d",a);
printf("%d",s);
}

输入用户给出的是 5 输出是 7 和 13

为什么?

【问题讨论】:

  • 第二个例子我也看到714ideone.com/vJbaH
  • @Blindy:仅++a + ++a 部分就足够了。 a 被修改了两次,没有任何中间序列点。就是这样。见c-faq.com/expr/evalorder2.html
  • 它仍然是未定义的行为,即使有两个预增量 AFAIK - 第二个预增量可能发生在第一次读取之后或之前。或者其他任何东西——因为它是未定义的。
  • 未定义,盲人。标准的附录 Cnot+ 列为序列点。无论是前置增量还是后置增量都没有区别,只是没有干预序列点的双重修改使其未定义。正确的输出是由编译器想要做的任何该死的事情组成的集合:-)

标签: c scanf unary-operator operator-precedence


【解决方案1】:

未定义的行为:

s=++a + ++a;

任何事情都可能在未定义时发生,所以你的行为是完全有效的。

【讨论】:

  • @Blindy:也许您可以准确地解释一下缺少什么。
  • 他忽略了这一点,无论这一行如何,OP 的代码版本都应该(并且确实)在同一个编译器上返回相同的内容。这就是问题的真正意义所在。
  • @Blindy:问题不是这么说的。 14 != 13.
  • 不,Blindy,我认为你没有抓住重点:未定义的意思正是如此,未定义。即使是第一个程序,每次运行它时给出一个完全不同的、随机的答案也是完全可以接受的。编译器格式化您的硬盘或空间自行折叠并形成奇点也是完全可以接受的。您具有相同的 int 和相同的语句这一事实是无关紧要的。编译器可以随意做任何事情。这就是为什么您不要使用未定义的行为!
  • @Blindy 2 行带有s = ++a + ++a 的行为实际上不必相同,因为标准未定义行为。
【解决方案2】:

我怀疑这是编译器优化的产物,在第一个示例中 a 是已知的,因此编译器会优化预增量以在添加之前发生。在第二个示例中,该值是未知的,编译器没有优化序列,导致它从左到右完成。这可能是您特定编译器的功能,需要专门查看。

【讨论】:

    【解决方案3】:

    未定义的行为。改变它,否则你有被猛禽攻击的风险。

    【讨论】:

      【解决方案4】:

      嗨,哥们,这个编码在 VI 编译器中可以正常工作..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多