【问题标题】:Volatile in C, How does it work internally [duplicate]C中的易失性,它如何在内部工作[重复]
【发布时间】:2013-04-10 05:08:27
【问题描述】:

只是想知道 volatile 关键字在内部是如何工作的。

在 GCC 和 Turbo C(基于 DOS)这两种情况下都进行了尝试,它的行为方式不同。

volatile int iData;
iData = 5;
printf("%d %d %d %d %d %d\n", ++iData, iData++, iData++, ++iData, iData, iData++);

输出依赖于 printf 函数数据传递还是基于编译器?

谢谢 干杯!!

【问题讨论】:

  • 输出可以取决于你想要的任何东西,因为你的程序调用了未定义的行为。无论iData 是否为volatile,它都会这样做。这是一个重复的问题。
  • 查找ISO/IEC TR3标准草案部分6.7.3.6。 [链接](www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf).该部分不难理解
  • 不要尝试使用 Turbo C,它不遵循任何版本的 C 标准。此外,您的示例是无稽之谈,并且依赖于未定义和未指定的行为。

标签: c linux-kernel x86 linux-device-driver cpu-registers


【解决方案1】:

您通过在同一语句中多次修改iData 来调用未定义的行为。由于行为是未定义的,不同的编译器可以为它做不同的事情,它们都不是错的。所以你真的不希望你的代码中有未定义的行为。

更多详情请见Why are these constructs (using ++) undefined behavior?

注意:代码中的奇怪行为与 volatile 关键字无关。有关volatile 的更多信息,请参阅Why is volatile needed in C?

【讨论】:

  • 谢谢斯科特。我想知道 volatile 究竟是如何工作的?
  • @Planet:然后发布一个新问题。您问题中的代码与volatile 的工作方式无关,因为整个程序由于多次修改对象而没有中间序列点而具有未定义的行为。
  • @Planet 我在底部添加了一个链接,应该解释volatile
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多