从C语法来看,输入++i似乎有两个派生:要么作为前缀增量运算符处理,要么作为2整数提升处理,如+(+i) (--i也是如此)。
我遗漏了什么?
unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
unary-operator: one of
& * + - ~ !
cast-expression:
unary-expression
( type-name ) cast-expression发布于 2014-07-24 20:29:38
lexer正在使用最大咀嚼原理,它将尽可能多地使用字符来形成一个有效的令牌,以避免这些类型的歧义。
我们可以通过转到起草C99标准节6.4词法元素来确认这一点,该部分说:
如果输入流已被解析为预处理标记,直至给定字符,则下一个预处理令牌是构成预处理令牌的最长字符序列。..。
它提供了两个例子:
示例1程序片段1Ex被解析为预处理数字令牌(它不是有效的浮点数或整数常量令牌),尽管解析作为预处理令牌1和Ex可能产生有效表达式(例如,Ex是定义为+1的宏)。类似地,程序片段1E1被解析为预处理数字(一个有效的浮动常量令牌),不管E是否宏名。
和
示例2将程序片段x+++++y解析为x ++ ++ + y,这违反了增量运算符的约束,尽管解析x ++ +++y可能会产生正确的表达式。
发布于 2014-07-24 20:30:35
按照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 + ++bhttps://stackoverflow.com/questions/24943306
复制相似问题