"a +++ i"是否等于"(a ++)+ i"

San*_*kin 6 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;
}    
Run Code Online (Sandbox Code Playgroud)

此代码输出似乎是4 4 5.但为什么a+++i等于a++ + i

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

或者是因为操作遵循优先顺序

并且它在所有编译器上的工作方式是否相同?

Ant*_*vin 5

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

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

那里还有一个例子:

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