“a +++ i”是否等于“(a ++)+ i”

时间:2014-10-07 12:05:48

标签: c operator-precedence

#include <stdio.h>

int main(void) 
{
    int a = 1, i = 3, x, y, z;
    a = 1; i = 3;
    x = a+++i;
    a = 1; i = 3;
    y = a++ + i;
    a = 1; i = 3;
    z = a + ++i;
    printf("%d %d %d", x, y, z);
    scanf(" ");
    return 0;
}    

此代码输出显示为4 4 5。但为什么a+++i等于a++ + i

是因为编译器总是从左到右阅读源代码?

或者是因为操作遵循the order of precedence

它会在所有编译器上都一样吗?

2 个答案:

答案 0 :(得分:5)

C11标准,部分6.4 (Lexical elements)/4说(并且在C99中它是相同的):

  

如果输入流已被解析为预处理令牌,直到给定的字符,那么   下一个预处理令牌是可构成一个的最长字符序列   预处理令牌。

还有一个例子:

  

程序片段x+++++y被解析为x ++ ++ + y,违反了约束条件   增量运算符,即使解析x ++ + ++ y可能产生正确的表达式。

答案 1 :(得分:1)

我无法全部说明,因为C编译器的实现可能会有所不同。但通常是的,你是对的。 C编译器应该是贪婪的,即尽可能多地读取,因此+++ == ++ +