可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
代码1:
main()
{
int a=5;
printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
}
ANS:
Value : 8 7 9 5
代码2:
main()
{
volatile int a=5;
printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
}
ANS:
Value : 8 7 7 5
代码3:
main()
{
int a;
scanf("%d",&a);
printf("Value : %d %d %d %d\n",a++,a++,++a,a++);
}
INPUT is 5
ANS:
Value : 8 7 7 5
上述程序如何获得不同的输出?
我试验了volatile变量,它用于防止编译器优化。 所以我理解了代码2.但我想知道代码1和代码3是如何工作的?
答案 0 :(得分:1)
volatile
是告诉编译器每次都从内存中读取值,而不是在优化过程中对值进行任何缓存。
您的代码显示未定义的行为,使用volatile
无论如何都不会改变。
答案 1 :(得分:1)
您拥有的是未定义的行为 您的代码不会在没有插入序列点的情况下多次修改变量 您无法使用此代码得出任何结论。它只保证一件事:输出未定义。
This 我的回答详细解释了为什么这是未定义的行为。请注意,虽然答案是针对C ++的,但C也存在完全相同的推理和规范。
c中的volatile和local变量有什么区别?
使用关键字volatile
告诉编译器通过使用寄存器缓存来限制任何优化。
答案 2 :(得分:0)
这是未定义的行为。没人能预测
的正确输出printf("%d %d",a++,++a);
首先执行哪一个a++
或++a
,因此对于不同的编译器或不同的场景,它是不同的输出。