i +++ j总是被视为i ++ + j吗?

时间:2013-09-01 17:17:22

标签: c operators

在printf语句i+++j中,是否始终将其视为i++ +j

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
    int i =5,j= 6, z;
    z=i^j;
    printf("%d",i+++j);
    return 0;
}

3 个答案:

答案 0 :(得分:19)

i+++j相当于i++ + j

这与运算符优先级无关。在解析表达式之前,编译器将+++解析为++ +

C标准定义了一系列转换阶段,每个阶段都使用前一个输出作为输入。在阶段3中+++被解析为++ +,它将源分解为预处理器令牌。直到阶段7,句法和语义分析才考虑运算符优先级。 (转换阶段不必作为不同的阶段或过程实现,但编译器必须表现得像它们一样。)

+++解析为++ +而非+ ++的规则被非正式地称为“最大蒙克规则”。第6.4节第4段中说明了这一点:

  

如果输入流已被解析为预处理令牌,则最多为a   给定字符,下一个预处理标记是最长的序列   可以构成预处理令牌的字符。

(有趣的是,该指数指的是“最大的咀嚼”,但该标准中的其他任何地方都没有提及该术语。)

这也意味着i+++++j,其中可以被标记为有效表达式i++ + ++j,实际上是i ++ ++ + j,这是语法错误。

当然,对于程序员来说,解决方案是添加空格以使标记清晰明确:i++ + j。 (i+++j对编译器来说非常清楚,但i++ + j对于人类读者来说更清晰。)

参考:N1570,第6.4节,第4段.N1570是2011 ISO C标准的草案。此规则与早期版本的标准相同。讨论翻译阶段

答案 1 :(得分:1)

是。它将被解析为(i++) + (j)

答案 2 :(得分:-2)

由于postfix递增/递减运算符优先于加法运算符,所以毫无疑问它将被视为(i ++)+ j。 因此,它不是编译器问题,您应该考虑运算符优先级图表。

另外,我建议你在表达式之间放置适当的空格,如果你稍后再查看代码,这将是有益的。 :)

希望有所帮助!