序列点和评估顺序
我正在通过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
的值。