C/C++数学运算顺序

Cae*_*sar 5 c c++ math operator-precedence

所以我知道C++有一个运算符优先级

int x = ++i + i++;
Run Code Online (Sandbox Code Playgroud)

未定义,因为pre ++和post ++处于同一级别,因此无法确定哪个将首先计算.但我想知道的是,如果

int i = 1/2/3;
Run Code Online (Sandbox Code Playgroud)

未定义.我问的原因是因为有多种方法可以看(1/2)/ 3 OR 1 /(2/3).我的猜测是它是一个未定义的行为,但我想确认一下.

Ree*_*sey 17

如果查看C++ 运算符优先级和关联性,您将看到除法运算符是从左到右的关联,这意味着它将被计算为(1/2)/3,因为:

位于同一单元格中的运算符(单元格中可能有多行运算符)在给定方向上使用相同的优先级进行求值.例如,表达式a = b = c被解析为a =(b = c),而不是因为从右到左的关联性而被解析为(a = b)= c.


hmj*_*mjd 5

第一个代码片段是未定义的行为,因为变量i在序列点之间被多次修改.

第二个代码片段是定义的行为,相当于:

int i = (1 / 2) / 3;
Run Code Online (Sandbox Code Playgroud)

因为运营商/具有从左到右的关联性.


jco*_*der 5

在您的示例中,编译器可以按照自己喜欢的顺序自由地评估"1""2"和"3",然后从左到右应用分区.

对于i ++ + i ++示例也是如此.它可以按任何顺序评估i ++,这就是问题所在.

并不是函数的优先级没有被定义,而是它的参数的评估顺序是.