1

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等……)

代码 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 variable ,它用于防止编译器优化。所以我理解了代码 2。但我想知道代码 1 和 3 是如何工作的?

4

3 回答 3

1

volatile是告诉编译器每次都从内存中读取值,而不是作为优化的一部分对值进行任何缓存。

您的代码表现出未定义的行为,无论如何都不会通过使用volatile.

于 2012-09-24T07:24:46.423 回答
1

你所拥有的是一个未定义的行为
您的代码多次修改变量而没有中间序列点。
您不能使用此代码得出任何结论。它只保证一件事:输出是Undefined

我的这个答案详细解释了为什么这是未定义的行为。请注意,尽管答案适用于 C++,但 C 也存在完全相同的推理和规范。

c中的易失性和局部变量有什么区别?

使用关键字volatile告诉编译器通过使用寄存器缓存来限制任何优化。

好读:
Herb Sutter 的优秀文章“易失性与易失性”

于 2012-09-24T07:25:07.710 回答
0

这是未定义的行为。没有人能预测出正确的输出

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

无论对于不同的编译器或不同的场景,它是否是不同的输出,a++都会首先执行哪一个。++a

于 2012-09-24T07:24:13.487 回答