gpt4 book ai didi

c - 赋值表达式和 volatile

转载 作者:行者123 更新时间:2023-12-02 02:11:15 27 4
gpt4 key购买 nike

我似乎对volatiles有一个合理的了解一般来说,但有一个看似晦涩的案例,我不确定按照标准应该如何运作。我已经阅读了 C99 的相关部分以及关于 SO 的十几个或更多相关帖子,但找不到这种情况下的逻辑或解释这种情况的地方。

假设我们有这样一段代码:

  int a, c;
volatile int b;
a = b = 1;
c = b += 1; /* or equivalently c = ++b; */

a像这样评估:
  b = 1;
a = b; // volatile is read

或者像这样:
  b = 1;
a = 1; // volatile isn't read

?

同样,应该 c像这样评估:
  int tmp = b;
tmp++;
b = tmp;
c = b; // volatile is read

或者像这样:
  int tmp = b;
tmp++;
b = tmp;
c = tmp; // volatile isn't read

?

在简单的情况下,如 a = b; c = b;事情很清楚。但是上面的那些呢?

基本上,问题是,当对象是 volatile 时,C99 的 6.5.16c3 中“表达式具有赋值后左操作数的值”究竟是什么意思?:

An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment, but is not an lvalue.



它是否意味着额外读取 volatile 以生成赋值表达式的值?

更新 :

所以,这就是困境。

如果“赋值后对象的值”不是通过额外读取 volatile 对象获得的,那么编译器会假设 volatile 对象 b :
  • 能够持有任意 int写入其中的值,可能不是(例如,位 0 硬连线为 0,这对于硬件寄存器来说并不罕见,我们应该使用 volatile)
  • 无法在分配写入发生的时间点和获得表达式值的时间点之间更改(这也可能是硬件寄存器的问题)

  • 由于所有这些,如果不是从 volatile 对象的额外读取中获得的表达式值,则不会产生 volatile 对象的值,标准声称应该是这种情况。

    这两个假设似乎都不太适合 volatile 对象的性质。

    如果,OTOH,“赋值后对象的值”是从所述 volatile 对象的额外隐含读取中获得的,那么使用 volatile 左操作数评估赋值表达式的副作用取决于是否使用了表达式值完全任意的,这将是一种奇怪的、意外的和记录不足的行为。

    最佳答案

    C11 澄清这是未指定的。
    你可以找到C11的最终草案here .你现在引用的第二句话是指脚注111:

    An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,111) but is not an lvalue.


    脚注 111 是这样说的:
    1. The implementation is permitted to read the object to determine the value but is not required to, even when the object has volatile-qualified type.

    关于c - 赋值表达式和 volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666916/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com