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.
为什么会发生这种情况,为什么在第一种情况下不执行增量运算符?
编辑:只是为了澄清,我问为什么当我分别使用这些线,一个接一个,而不是所有三个同时使用这些线时.
这两种情况都涉及某种未定义的行为,因为您在 2 个序列点内递增a、返回a并分配给a左侧。需要 3 才能得到明确定义的结果。
在这种情况下 :
a = (a < b) ? a++ : b++;
a小于ba作为三元运算符的结果返回(值 = 5)a递增(值 = 6)。a(覆盖 6)步骤 3 和 4 的顺序未定义。它相当于a = a++;
在这种情况下 :
a = (a++ < b++) ? a : b;
a更小ba和b递增(无论哪个较小)a作为三元运算符的结果返回a步骤 2 和 3 的顺序没有明确定义。
在这种情况下,跟踪序列点很重要。相关规则:
?排在第二个或第三个表达式之前。并且它们中的任何一个都在分配之前进行排序。?a++值在递增之前返回未定义的行为:
a = a++;之间没有序列点。两者都发生在返回原始值之后aaaa++ ? a : b之间没有序列点。两者都发生在aa?