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

Kus*_*wal 3 c continue break sequence-points language-lawyer

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

  1. 在函数调用和实际调用中的函数指示符和实际参数的评估之间;

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

  3. 在条件 ?: 运算符的第一个操作数的评估与第二个和第三个操作数中的任何一个评估之间;

  4. 完整声明符的结束;

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

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

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

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

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

那么,分号是在break;还是continue;序列点中?

Kam*_*Cuk 5

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

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

所以,分号是中断吗?或继续;一个序列点?

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

它不是函数调用,不是逻辑运算符&& ||,不是,运算符,不是三元?:运算符,不是声明,不是完整表达式- 它没有列在您引用的列表中(列表来自ANNEX C),无论如何它都不是易变的并且没有 I/O。所以,好吧,在当你排除了不可能的时候,剩下的,无论多么不可能,都必须是真相”的逻辑,在之后break;和之后确实没有序列点continue;