gpt4 book ai didi

c - 下面的预递增表达式真的会导致无序修改吗?

转载 作者:行者123 更新时间:2023-12-05 08:36:25 24 4
gpt4 key购买 nike

我有一个遗留代码使用这条指令执行双缓冲:

bufferIndex = ++bufferIndex & 1;

clang 警告 bufferIndex 的未排序修改顺序

warning: multiple unsequenced modifications to 'bufferIndex' [-Wunsequenced]

毫无疑问,我会避免这种构造,特别是因为知道 bufferIndex 已适本地初始化为 0 或 1,所以这个触发器可以写得更简单:

bufferIndex ^= 1;

即使毫无疑问,我也会避免这种预增量结构,这样我就不会在我的审稿人脑海中造成困惑,这样我就不会无用地产生头脑 Storm 警告。
但这不是我的意思。我的意思是,我想了解未排序的修改是否可能适用于我自己的文化。

在这种情况下评估顺序真的未定义,还是警告有点粗暴?

注意:这与 Unsequenced modification warning 不同其中变量明显以未排序的方式出现两次,也没有出现在 SO 建议的其他可能重复项中(除非我忽略了)。

根据我的理解,这适用于这种赋值运算符 = 的情况一点也不明显,因为必须在赋值之前对表达式求值,并且因为唯一的副作用是预递增,并且在求值期间的某个时候必然会发生和分配之前。

最佳答案

这条语句仍然会触发undefined behavior .

所涉及的运算符(=、二进制&、前缀++)都没有引入序列点, =++ 运算符更新它们的操作数之一作为副作用。并且因为 bufferIndex 在没有序列点的情况下被副作用多次修改,我们有未定义的行为。

这在 C standard 的第 6.5p2 节中有详细说明:

If a side effect on a scalar object is unsequenced relativeto either a different side effect on the same scalar objector a value computation using the value of the same scalarobject, the behavior is undefined. If there are multipleallowable orderings of the subexpressions of an expression, thebehavior is undefined if such an unsequenced side effect occursin any of the orderings.84)

事实上,上面引用的脚注 84 给出了一个与您几乎相同的示例:

84)) This paragraph renders undefined statement expressions such as

i = ++i + 1;
a[i++] = i;

while allowing

i = i + 1; 
a[i] = i;

关于c - 下面的预递增表达式真的会导致无序修改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69223499/

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