5

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

int x = ++i + i++;

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

int i = 1/2/3;

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

4

5 回答 5

17

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

同一单元格中的运算符(一个单元格中可能列出了几行运算符)在给定方向上以相同的优先级进行评估。例如,表达式 a=b=c 被解析为 a=(b=c),而不是 (a=b)=c,因为从右到左的关联性。

于 2012-07-02T15:43:03.143 回答
5

在您的示例中,编译器可以自由地以它喜欢的任何顺序评估“1”“2”和“3”,然后从左到右应用除法。

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

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

于 2012-07-02T16:40:25.077 回答
5

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

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

int i = (1 / 2) / 3;

as 运算符/具有从左到右的关联性。

于 2012-07-02T15:43:50.697 回答
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。

于 2012-07-02T15:45:11.587 回答
0

可能会说它是未定义的,因为您选择了一个 int,它是整数的集合。尝试包含分数的双精度或浮点数。

于 2013-03-14T01:34:33.960 回答