假设E
,F
和G
是不包含比逗号优先级高的操作符的表达式。表达式((E, F), G)
和(E, (F, G))
在标量、列表和/或void上下文中是否相等?更准确地说,您是否总是用(E, (F, G))
替换((E, F), G)
,反之亦然,而不会影响程序的执行?
上下文不影响代码的解析方式。
逗号/列表操作符保证从左到右计算每个操作数(与上下文无关)。
[1] 从这个和更多的信息,我们可以证明E, F, G
,( E, F ), G
和E, ( F, G )
是等价的。既然你特别提到了上下文,我们将更详细地研究它。
对于void, list或indeterminate[2]contextc,在所有情况下,每个项都得到相同的contextc。
c c c
------- ----------- -----------
c c c c c c c
- - - -------- - - --------
c c c c
- - - -
E, F, G ( E, F ), G E, ( F, G )
对于标量上下文(s),除最后一项外,在所有情况下都得到void context (v)。
s s s
------- ----------- -----------
v v s v s v s
- - - -------- - - --------
v v v s
- - - -
E, F, G ( E, F ), G E, ( F, G )
我希望能够说它们编译相同,但是它们没有。尽管文档说它是一个二进制运算符,但它被实现为一个n进位运算符。parent会导致创建操作符的另一个实例(在示例中有效地使其成为二进制操作符)。
当它是子表达式的最后一个表达式时,上下文只在运行时才知道,我称之为"不确定"。除了标量上下文中的列表/逗号操作符之外,这没有什么区别。运行时上下文被传播到每个操作数,因此如果只在运行时知道,则得到s,s,s,尽管如果上下文在编译时已知,则得到v,v,s。
正如你在上面看到的,这并不影响答案。E, F, G
,( E, F ), G
和E, ( F, G )
是等价的,无论上下文在编译时是否已知。