所以我知道C ++有一个运算符优先级
int x = ++i + i++;
是未定义的,因为pre ++和post ++处于同一级别,因此无法确定首先计算哪一个。但我想知道的是,
int i = 1/2/3;
未定义。我问的原因是因为有多种方法可以看(1/2)/ 3 OR 1 /(2/3)。 我的猜测是它是一个未定义的行为,但我想确认一下。
答案 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。