This question already has answers here:
3 plus symbols between two variables (like a+++b) in C [duplicate]

(3个答案)


7年前关闭。




在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;
}

最佳答案

i+++j等效于i++ + j

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

C标准定义了一系列翻译阶段,每个阶段均使用前一个阶段的输出作为输入。阶段3将+++解析为++ +,这会将源分解为预处理器 token 。在阶段7,句法和语义分析之前,不考虑运算符优先级。 (翻译阶段不必作为不同的阶段或过程来实现,但是编译器必须表现得就像它们一样。)

+++的规则被解析为++ +而不是+ ++的规则被非正式地称为“最大mu割规则”。在第6.4节第4段中进行了说明:



(有趣的是,该索引指的是“最大嚼食”,但该术语在标准中没有其他地方提及。)

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

当然,对于程序员而言,解决方案是添加空格以使对 token 的划分清楚:i++ + j。 (i+++j对编译器是完全清楚的,但i++ + j对人类读者而言则更加清晰。)

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

关于c - i+++ j总是被视为i+++ j吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18560904/

10-11 18:22