gpt4 book ai didi

c++ - 这种未定义行为的基本原理是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:38 33 4
gpt4 key购买 nike

Warning[...]: undefined behavior: the order of volatile accesses is undefined in this statement x.cpp xxx

为什么这一行是未定义的行为?

  case 2:
Vdda = 3.3 * (*VREFINT_CAL) / ADC_DR->DATA;

声明/初始化在哪里:

volatile short const *VREFINT_CAL = (short *) 0x1FFFF7BA;

volatile STRUCT_ADC_DR *ADC_DR = (STRUCT_ADC_DR*) 0x40012440;

定义者:

typedef struct
{
unsigned DATA : 16;
unsigned : 16;
} STRUCT_ADC_DR;

是不是因为编译器不确定 volatile 元素的访问顺序可能会有所不同? (什么情况)

但是由于运算符具有相同的优先级,难道不应该确保从左到右执行计算吗?

最佳答案

volatile 向编译器暗示您正在读取不是普通内存地址的内容,例如 I/O 端口。对于两次这样的读取,您很可能希望这些读取按特定顺序发生。

在 C 和 C++ 中,操作数的计算顺序都没有定义。如果对您有帮助,请将除法视为函数调用:

Vdda = 3.3 * divide(*VREFINT_CAL, ADC_DR->DATA);

现在的重点是,对于 volatile,顺序很可能很重要,您可能不希望将此决定留给编译器。所以它会发出警告。

要消除警告,只需通过在代码中引入额外的序列点来明确顺序。例如:

short const x = *VREFINT_CAL;
unsigned const y = ADC_DR->DATA;
Vdda = 3.3 * x / y;

关于c++ - 这种未定义行为的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31269050/

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