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?
是因为编译器总是从左到右阅读源代码?
或者是因为操作遵循优先顺序?
并且它在所有编译器上的工作方式是否相同?
C11标准,部分6.4 (Lexical elements)/4说(并且在C99中它是相同的):
如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列.
那里还有一个例子:
程序片段
x+++++y被解析为x ++ ++ + y,违反了增量运算符的约束,即使解析x ++ + ++ y可能产生正确的表达式.