3

我正在为强调的线寻找一些澄清。

(C99 6.5.16/3) 赋值运算符将值存储在左操作数指定的对象中。赋值表达式在赋值后具有左操作数的值,但不是左值。赋值表达式的类型是左操作数的类型,除非左操作数具有限定类型,在这种情况下,它是左操作数类型的非限定版本。更新左操作数的存储值的副作用应发生在前一个和下一个序列点之间。

考虑以下示例:

int x = 42;
int y = 0;

int main()
{
   // side effect of modifying 'x'
   x = y;
}

前一个和下一个序列点是什么?在 main 的开头是否有序列点?

4

3 回答 3

3

C99 5.1.2.3 将序列点定义为先前评估的所有副作用都已发生且后续评估的副作用尚未开始发生的位置。标准的附件 C 定义了序列点发生的位置:函数调用、逻辑运算符的结尾、逗号运算符和三元运算符、完整声明的结尾、完整表达式的结尾等。

在这种情况下,前一个序列点是 的开始main(),下一个序列点是赋值末尾的分号。在第一个序列点处,x值为 42,在第二个序列点处,值为 0。

于 2012-12-28T12:33:18.113 回答
0

这是C FAQ中关于序列点的解释。

在这种情况下,序列点就在完整表达式之前和之后x = y;

于 2012-12-28T12:34:42.870 回答
0

只是为了添加到 user4815162342 的答案,评论太长了。语句按顺序排列:

语句指定要执行的操作。除非另有说明,否则语句按顺序执行。

因此,根据经验,每个 都有一个序列点;,尽管标准中没有明确提及它们。

于 2012-12-28T12:36:19.327 回答