1

在 C 运算符优先级的上下文中。实际上,以下代码将被评估如下:

int32_t * result = (int32_t *) addr_base + offset;

                        |
                        |
                        ↓

int32_t * result = ((int32_t *) addr_base) + offset;

但是,我在下表中看到的是,cast应该+从右到左进行评估。换句话说,在我的例子+中是正确的cast,所以我希望上面的第一个语句将被这样评估:

int32_t * result = (int32_t *) (addr_base + offset);

就像+在右侧一样cast(根据表格,优先级更高)。

为什么会发生这种情况?

在此处输入图像描述

4

4 回答 4

3

+2 行中的一元加运算符。这类似于一元否定运算符(例如x = -y

加法运算符在第 4 行,其优先级低于强制转换。

如果两个运算符具有相同的优先级,则顺序由关联性给出(从左到右或从右到左)

于 2019-07-26T23:11:39.957 回答
1

转换运算符的优先级高于加法,这就是操作数与转换运算符分组的原因。

一元加号与强制转换具有相同的优先级。如果您要在同一个表达式中使用它们,则关联性将从右到左。

于 2019-07-26T23:10:39.797 回答
1

强制转换运算符与一元运算符具有相同的优先级+,但+运算符 in(int32_t) addr_base + offset是二元+运算符,其优先级较低。

元运算符是只有一个操作数的运算符。在x = -y;中,-是一元运算符。我们也可以写x = +y;,其中 the+是一元运算符,但很少这样做,因为它在很大程度上是多余的。

二元运算符是具有两个操作数的运算符。在x = y + z中,+是二元运算符。

于 2019-07-26T23:11:27.900 回答
1

尽管一元加号与强制转换具有相同的优先级,但所讨论的表达式涉及 binary +,它在优先级表中低两行。所以

(int32_t *) addr_base + offset

被明确地解析为

((int32_t *) addr_base) + offset
于 2019-07-26T23:12:14.307 回答