首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一元算子歧义

一元算子歧义
EN

Stack Overflow用户
提问于 2014-07-24 20:25:30
回答 2查看 545关注 0票数 3

从C语法来看,输入++i似乎有两个派生:要么作为前缀增量运算符处理,要么作为2整数提升处理,如+(+i) (--i也是如此)。

我遗漏了什么?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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可能会产生正确的表达式。

票数 5
EN

Stack Overflow用户

发布于 2014-07-24 20:30:35

按照C标准

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

所以不存在歧义。

例如,在这个程序中

代码语言:javascript
复制
#include <stdio.h>

int main( void ) 
{

    int a = 1;
    int b = 10;
    int c = a+++b;

    printf( "c = %d\n", c ); 
}   

输出将是

代码语言:javascript
复制
11

因为表达

代码语言:javascript
复制
a+++b

将被解释为

代码语言:javascript
复制
a++ + b

不像

代码语言:javascript
复制
a + ++b
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24943306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档