所以我知道 C++ 有一个运算符优先级,并且
int x = ++i + i++;
是未定义的,因为 pre++ 和 post++ 处于同一级别,因此无法判断哪个将首先计算。但我想知道的是,如果
int i = 1/2/3;
未定义。我问的原因是因为有多种方法可以查看 (1/2)/3 OR 1/(2/3)。我的猜测是这是一种未定义的行为,但我想确认一下。
所以我知道 C++ 有一个运算符优先级,并且
int x = ++i + i++;
是未定义的,因为 pre++ 和 post++ 处于同一级别,因此无法判断哪个将首先计算。但我想知道的是,如果
int i = 1/2/3;
未定义。我问的原因是因为有多种方法可以查看 (1/2)/3 OR 1/(2/3)。我的猜测是这是一种未定义的行为,但我想确认一下。
如果您查看 C++运算符优先级和关联性,您会看到除法运算符是从左到右关联的,这意味着这将被评估为(1/2)/3
,因为:
同一单元格中的运算符(一个单元格中可能列出了几行运算符)在给定方向上以相同的优先级进行评估。例如,表达式 a=b=c 被解析为 a=(b=c),而不是 (a=b)=c,因为从右到左的关联性。
在您的示例中,编译器可以自由地以它喜欢的任何顺序评估“1”“2”和“3”,然后从左到右应用除法。
i++ + i++ 示例也是如此。它可以以任何顺序评估 i++,这就是问题所在。
不是没有定义函数的优先级,而是它的参数的评估顺序是。
第一个代码片段是未定义的行为,因为变量i
在序列点之间被多次修改。
第二个代码片段是定义的行为,相当于:
int i = (1 / 2) / 3;
as 运算符/
具有从左到右的关联性。
它被定义,它从左到右:
#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。
可能会说它是未定义的,因为您选择了一个 int,它是整数的集合。尝试包含分数的双精度或浮点数。