一元算子模糊

z̫͋*_*z̫͋ 3 c grammar ambiguity lexical-analysis unary-operator

查看C语法,似乎输入++i可以有2个派生:要么被视为前缀增量运算符,要么被视为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
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 5

词法分析器使用最大munch原则,并且将尽可能多的字符形成有效的令牌以避免这些类型的歧义.

我们可以通过参考草案C99标准部分的6.4 词汇元素来证实这一点:

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

它提供了两个例子:

示例1程序片段1Ex被解析为预处理数字标记(一个不是有效的浮点或整数常量标记),即使解析为预处理标记1和Ex可能会生成有效表达式(例如,如果Ex是一个定义为+1的宏.类似地,程序片段1E1被解析为预处理数(一个是有效的浮动常量令牌),无论E是否是宏名.

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