一元算子模糊

时间:2014-07-24 20:25:31

标签: c grammar lexical-analysis ambiguity unary-operator

查看C语法,似乎输入++i可以有2个派生:要么被视为前缀增量运算符,要么被视为2整数提升,如+(+i)(同样适用于{ {1}})。
我错过了什么?

--i

2 个答案:

答案 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