C/C++中的运算符优先级和关联性

Kir*_*rov 4 c c++ operator-precedence associativity

请注意,这与Operator Precedence ..()和++,未定义的行为和序列点无关,为什么这些构造(使用++)是未定义的行为?以及关于此的数百个类似问题


简而言之:标准保证了协会性吗?

详细示例:来自维基百科关于运算符优先级的文章,operator*并且operator/具有相同的优先级,它们是Left-to-right运算符.这是否意味着,标准保证,这:

int res = x / y * z / t;
Run Code Online (Sandbox Code Playgroud)

将被评估为

int res = ( ( x / y ) * z ) / t;
Run Code Online (Sandbox Code Playgroud)

还是它的实现定义了?

如果有保证,你能引用吗?


这只是出于好奇,我总是在这些情况下写括号.
准备删除问题,如果有这样的话.

Tem*_*Rex 6

来自最新的公开草案

5.6乘法运算符[expr.mul]

1乘法运算符*,/和%组从左到右.

multiplicative-expression:
pm-expression
multiplicative-expression * pm-expression
multiplicative-expression / pm-expression
multiplicative-expression % pm-expression
Run Code Online (Sandbox Code Playgroud)

所以解析会像:

int res = x / y * z / t;
int res = (x / y * z) / t;
int res = ((x / y) * z) / t;
Run Code Online (Sandbox Code Playgroud)

  • 为了解释这个没有被引入正式语法的人:标准中的这个文本表明乘法表达式(我将缩写为"ME")必须由pm表达式("PE")或其中一个表达式构成.以下组合:"ME*PE","ME/PE","ME%PE".出于我们的目的,诸如"x"和"y"的标识符已经是PE.要从"x/y*z"形成ME,必须将"x/y"变为ME,然后使用该ME将"ME*z"形成另一个ME.你不能先把"y*z"形成一个ME,因为那会给你"x/ME",而且因为x是一个PE,它就是"PE/ME".... (2认同)

For*_*veR 5

n3337 5.6/1

乘法运算符*,/和%组从左到右.

读5标准杆.