序列点和评估顺序

我正在通过K&R阅读,我在评估表达式时遇到了关于行为不确定性的这个例子,如a[i]=i++ ; 6.5美元的C99规格说明了这一点

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外,先前的值应该是只读的,以确定要存储的值。

上述K&R的例子在第一个声明中表现良好。 请解释一下如何在第二次失败。

标准是否涉及在涉及序列点的情况下子表达式的评估顺序。 例如。 a[i++] || b[i++] a[i++] || b[i++] 。 我知道这些是从左到右进行评估的,但是如何从上述声明中得出这个或者在标准中明确说明了什么呢?

标准是否说明了序列点情况下子表达式的评估顺序?

在条件运算符&&以及||情况下,评估的顺序很明确 这就是短路工作的原因。

它由c99标准明确规定。

参考: c99标准

附件J:J.1未指明的行为

1以下未指定:
…..

除了为函数调用(),&&,||,?:和逗号运算符(6.5)指定的情况外,评估子表达式的顺序和副作用的顺序除外。
…..

进一步说,
6.5.14逻辑OR运算符

4)与按位|不同 运算符,|| 运营商保证从左到右的评估; 在评估第一个操作数后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。

以及逻辑AND:

6.5.13逻辑AND运算符

与按位二元和运算符不同,&&运算符保证从左到右的评估; 如果评估第二个操作数,则在第一个和第二个操作数的评估之间存在一个序列点。 如果第一个操作数比较等于0,则不计算第二个操作数。

对于问题的第一部分:

该句子适用于由表达式改变的对象,即i (和a[i] )。 因此, i的先验值仅用于确定i的“新”值。

但表达式“使用”它也决定了要写入的数组元素。

背景是否则不清楚i是否在增量之前或之后表示i的值。