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