查看C语法,似乎输入++i
可以有2个派生:要么被视为前缀增量运算符,要么被视为2整数提升,如+(+i)
(同样适用于{ {1}})。
我错过了什么?
--i
答案 0 :(得分:5)
词法分析器正在使用maximal munch principle并且将尽可能多的字符来形成有效的令牌以避免这些类型的歧义。
我们可以转到draft C99 standard部分6.4
词汇元素来确认这一点:
如果输入流已被解析为预处理令牌,则最多为a 给定字符,下一个预处理标记是最长的序列 可以构成预处理令牌的字符。 [...]
它提供了两个例子:
示例1将程序片段1Ex解析为预处理号 令牌(一个不是有效的浮点或整数常量令牌), 即使解析为一对预处理令牌1和Ex也可能 生成有效的表达式(例如,如果Ex是定义为的宏 +1)。类似地,程序片段1E1被解析为预处理数(一个是有效的浮动常量令牌),无论是否E 是一个宏名。
和
示例2程序片段x +++++ y被解析为x ++ ++ + y,其中 违反增量运算符的约束,即使解析x ++ + ++ y可能会产生正确的表达式。
答案 1 :(得分:3)
根据C标准
4如果输入流已被解析为预处理令牌,则为 给定的字符,下一个预处理标记是最长的 序列可构成预处理令牌的字符。
所以没有歧义。
例如在这个程序中
#include <stdio.h>
int main( void )
{
int a = 1;
int b = 10;
int c = a+++b;
printf( "c = %d\n", c );
}
输出
11
因为表达
a+++b
将被解释为
a++ + b
不是
a + ++b