分号真的是C中的一个序列点吗?

Is the semicolon really a sequence point in C?

根据this answer,以下是标准中描述的序列点:

  1. 在函数调用和实际调用中对函数指示符和实际参数的求值之间;

  2. 运算符 &&、|| 和 ,;的第一个和第二个操作数的计算之间;

  3. 在对条件 ?: 运算符的第一个操作数求值与对第二个和第三个操作数中的任何一个进行求值之间;

  4. 完整声明符结束;

  5. 在对一个完整表达式求值和下一个要求值的完整表达式之间。以下为完整表达:

    • 初始化程序;
    • 表达式语句中的表达式;
    • 选择语句的控制表达式(if 或 switch);
    • while 或 do 语句的控制表达式;
    • for 语句的每个表达式;
    • return 语句中的表达式。
  6. 紧接在库函数之前 returns;

  7. 在与每个格式化的input/output函数转换说明符关联的动作之后;

  8. 在每次调用比较函数之前和之后,以及在对比较函数的任何调用和作为参数传递给该调用的对象的任何移动之间。

标准从未明确提到分号是一个序列点,但是已经声明的各种序列点暗示分号确实是一个序列点。

那么,break;continue;中的分号是序列点吗?

那么,break;continue;中的分号是序列点吗?

最好问问自己,为什么它不应该是一个序列点?

breakcontinue只是伪装goto,或者“jmp”。

goto 总是需要一个标签,又名指针,又名参数,以便能够跳转,breakcontinue 也是如此(它们的标签隐含在周围的循环)。

...

是的,break;continue;中的分号是一个序列点。

Is the semicolon really a sequence point in C?

没有。特定的语义语言构造在评估后特别需要有一个序列点。 (例如,Logical AND operator ...if the second operand is evaluated, there is a sequence point between... - 它是特定的)。序列点确实与语义相关(“对这件事的评估发生在那之前”)而不是与标记(“一切都发生在 ; 字符之前”)。

So, is the semicolon in break; or continue; a sequence point?

不,不是。与 goto 一起,它们看起来像是口语规则的例外。

不是函数调用,不是逻辑运算符&& ||,不是,运算符,不是三元运算符?:,不是声明,不是full expression - it's not listed in the list you quoted (the list is from ANNEX C), it's not anyhow volatile and does no I/O. So, well, under the "when you have eliminated the impossible, whatever remains, however improbable, must be the truth" 逻辑在 break;continue;.

之后确实没有序列点