为什么C99中的此语句在C11中更改了?

问题描述 投票:7回答:1

C99标准:

在上一个和下一个序列点之间,对象的存储值最多只能通过对表达式的求值来修改

C11标准:

如果相对于相同标量对象的另一个副作用,未对标量对象的副作用进行排序,则该行为未定义。

因此,C99标准的定义是否不完整,因此在C11中进行了更新,因为它仅包含术语object而不包含scalar object

c object language-lawyer c99 c11
1个回答
7
投票
这是因为C11试图涵盖多线程/并行执行。 “抽象机”中程序执行的基本规则在C99和C11(C11 5.1.2.3/3)之间增加了以下繁琐的文字:

之前排序是评估之间的不对称,可传递,成对关系 由单个线程执行,这会导致这些评估中的部分顺序。 给定任意两个求值A和B,如果A在B之前排序,则执行A 应该在执行B之前执行。(相反,如果A在B之前排序,则B是 如果A没有在B之前或之后排序,则A和B为 无序的。对A进行排序时,评估A和B的排序不确定 在B之前或之后,但未指定。13)序列点的存在 在表达式A和B的求值之间,意味着每次计算值和 在每次值计算和副作用之前先对与A相关的副作用进行排序 与B相关联。(序列点的摘要在附件C中给出。)

因此,您引用的部分(C99 6.5 / 2)进行了相应更改,以适应抽象机中程序执行的定义,据推测,该抽象机现在也涵盖了并行执行。不幸的是-由于C99文本可读性强得多。从技术上讲,如果您不考虑并行执行,则什么也不会改变。 C99中有关序列点的规则仍然适用,只是措辞不同。此更改还意味着将C11与具有类似规则的C ++ 11进行同步。

© www.soinside.com 2019 - 2024. All rights reserved.