C / C ++数学运算顺序

时间:2012-07-02 15:39:16

标签: c++ c math operator-precedence

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

int x = ++i + i++;

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

int i = 1/2/3;

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

5 个答案:

答案 0 :(得分:17)

如果你看一下C ++ operator precedence and associativity,你会发现除法运算符是从左到右的关联,这意味着它将被评估为(1/2)/3,因为:

  

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

答案 1 :(得分:5)

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

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

int i = (1 / 2) / 3;

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

答案 2 :(得分:5)

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

对于i ++ + i ++示例,它是相同的。它可以按任何顺序评估i ++,这就是问题所在。

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

答案 3 :(得分:2)

它被定义,它从左到右:

#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
    int i = 16/2/2/2;
    cout<<i<<endl;
    return 0;
}

打印“2”而不是1或16。

答案 4 :(得分:0)

可能会说它是未定义的,因为你选择了一个int,它是整数的集合。 尝试使用包含分数的double或float。