c中volatile和local变量有什么区别?

时间:2012-09-24 07:19:25

标签: c

  

可能重复:
  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是如何工作的?

3 个答案:

答案 0 :(得分:1)

volatile是告诉编译器每次都从内存中读取值,而不是在优化过程中对值进行任何缓存。

您的代码显示未定义的行为,使用volatile无论如何都不会改变。

答案 1 :(得分:1)

您拥有的是未定义的行为 您的代码不会在没有插入序列点的情况下多次修改变量 您无法使用此代码得出任何结论。它只保证一件事:输出未定义

This 我的回答详细解释了为什么这是未定义的行为。请注意,虽然答案是针对C ++的,但C也存在完全相同的推理和规范。

  

c中的volatile和local变量有什么区别?

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

好读:
Herb Sutter's excellent artile "volatile vs. volatile"

答案 2 :(得分:0)

这是未定义的行为。没人能预测

的正确输出
printf("%d %d",a++,++a);

首先执行哪一个a++++a,因此对于不同的编译器或不同的场景,它是不同的输出。