问题描述
根据this answer,以下是标准中描述的序列点:
-
运算符 &&、|| 和,的第一个和第二个操作数的计算之间;
-
完整声明符的结束;
-
在一个完整表达式的求值和下一个要求值的完整表达式之间。以下是完整的表达:
- 一个初始化器;
- 表达式语句中的表达式;
- 选择语句的控制表达式(if 或 switch);
- while 或 do 语句的控制表达式;
- for 语句的每个表达式;
- 返回语句中的表达式。
-
在库函数返回之前;
该标准从未明确提到分号是一个序列点,但是已经说明的各种序列点都暗示着分号确实是一个序列点。
那么,break;
或 continue;
中的分号是一个序列点吗?
解决方法
分号真的是 C 中的一个序列点吗?
没有。特定的语义语言结构在评估它们后特别需要有一个序列点。 (例如,例如 Logical AND operator ...if the second operand is evaluated,there is a sequence point between...
- 它是特定的)。序列点确实与语义(“对 this 的评估发生在那个之前”)而不是标记(“一切都发生在 ;
字符之前”)等相关。
所以,是break中的分号;或继续;一个序列点?
不,不是。与 goto
一起,它们看起来像是口语规则的例外。
它不是函数调用,不是逻辑运算符 &&
||
,不是 ,
运算符,不是三元 ?:
运算符,不是声明,不是 { {3}} - 它没有列在您引用的列表中(该列表来自 full expression),它无论如何都不是易变的,也没有 I/O。所以,好吧,在 ANNEX C 逻辑下,在 break;
和 continue;
之后确实没有序列点。
那么,break;
或 continue;
中的分号是序列点吗?
最好问问自己,为什么它不应该是一个序列点?
break
和 continue
只是伪装成 goto
,或“jmp
”。
goto
总是需要一个标签,也就是一个指针,也就是一个参数,才能跳转,break
和 continue
也是如此(这些标签被周围的环境隐含了)循环)。
...
是的,break;
或 continue;
中的分号是一个序列点。