cod*_*.tk 2 c operator-precedence language-lawyer
右侧总是会在左侧前方进行评估吗?然后右侧的结果将传递到左侧.我不是在谈论诸如此类的例外A[i]=i++
我说的是正常情况:
A[i] = (j+32+43 & K);
A[j] != (A[j] + A[k]);
Run Code Online (Sandbox Code Playgroud)
将所有这些表达式的正确部分首先评估,然后将结果与左侧进行比较?(总是)
不,没有这样的保证,N1570§6.5.16/ p3(强调我的):
赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,111)但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.
请注意,赋值运算符"消耗"两个操作数,并且具有修改左值的副作用.
一般来说,子表达式的计算顺序是未指定的,有一些例外,例如逻辑和、逻辑或、逗号运算符等......
由于您的评论表明您对一般规则感兴趣:
如果有任何一般规则,任何操作员@YuHao
这将包含在C99 标准部分6.5 表达式草案草案中,该段落3说(强调我的未来):
运算符和操作数的分组由语法指示。74) 除了后面指定的(对于函数调用 ()、&&、||、?: 和逗号运算符),子表达式的计算顺序和哪些副作用发生都未明确。
这在C11 标准草案中基本相同,但C11没有列出例外情况,因此引用 C99 更方便。3C11中的段落说:
运算符和操作数的分组由语法指示。85) 除了后面指定的之外,子表达式的副作用和值计算是无序的.86)
专门针对赋值运算符C99 说:
操作数的计算顺序未指定 [...]
C11 说:
[...] 操作数的评估是无序的。