在C中使用三元运算符的增量

Pyr*_*nth 8 c ternary-operator

例如,我使用后

int a = 5, b = 6;
x = (a < b) ? a++ : b++;
Run Code Online (Sandbox Code Playgroud)

x得到a的值,即5,增量为6,这是预期的.

我用的时候

a = (a < b) ? a++ : b++;
Run Code Online (Sandbox Code Playgroud)

在这一行之后,仍然是5.

a = (a++ < b++) ? a : b;
Run Code Online (Sandbox Code Playgroud)

a现在是6.

为什么会发生这种情况,为什么在第一种情况下不执行增量运算符?

编辑:只是为了澄清,我问为什么当我分别使用这些线,一个接一个,而不是所有三个同时使用这些线时.

Man*_*dis 2

这两种情况都涉及某种未定义的行为,因为您在 2 个序列点内递增a、返回a并分配给a左侧。需要 3 才能得到明确定义的结果。

在这种情况下 : a = (a < b) ? a++ : b++;

  1. 如果a小于b
  2. a作为三元运算符的结果返回(值 = 5)
  3. a递增(值 = 6)。
  4. 三元运算符 (5) 的结果分配给左侧变量a(覆盖 6)

步骤 3 和 4 的顺序未定义。它相当于a = a++;

在这种情况下 : a = (a++ < b++) ? a : b;

  1. 如果a更小b
  2. ab递增(无论哪个较小)
  3. a作为三元运算符的结果返回
  4. 它被分配给左侧变量a

步骤 2 和 3 的顺序没有明确定义。

在这种情况下,跟踪序列点很重要。相关规则:

  • 左边的三元运算符的第一个表达式?排在第二个或第三个表达式之前。并且它们中的任何一个都在分配之前进行排序。
  • 比较顺序先于?
  • 在表达式中,如a++值在递增之前返回

未定义的行为:

  • 在像这样的表达式中,左侧的(后)递增和分配a = a++;之间没有序列点。两者都发生在返回原始值之后aaa
  • 在像这样的表达式中, (后)递增和从三元运算符返回a++ ? a : b之间没有序列点。两者都发生在aa?