2010-10-23 54 views
4

我如何能理解的表达像C中表达式的解析规则是什么?

a = b+++++b---c--; 

在C解析?

我只是做了上述表示,是的,我可以用任何编译器检查的结果,但我想知道的是地规则我应该知道了解C.这样的表达式的解析

+1

@Martin:如果你能得到6。2/4从C标准中删除为“谁在乎”,那么你可以关闭“谁在乎”这个问题; -p Daft的例子可以说明基本原理。 – 2010-10-24 23:03:35

+1

[为什么不用+++++ b在C中工作?](https://stackoverflow.com/questions/5341202/why-doesnt-ab-work-in-c) – 2017-08-13 11:31:03

回答

5

从标准6.2(4):

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

他们甚至添加例如:

实施例2所述的程序片段X +++++ý 被解析为x ++ ++ + Y,其中 违反了增量 约束运算符,即使解析x ++ + ++ y可能会产生正确的表达式。

所以,你的发言:

a = b+++++b---c--; 

等同于:

a = b ++ ++ + b -- - c -- ; 
+3

这可以解开它。根据“解析”提问者的意思,您还需要使用运算符优先规则来构建表达式树。 – 2010-10-23 17:16:09

+0

2.1.1.2翻译阶段7. [...]预处理令牌转换为令牌。 [...] http://flash-gordon.me.uk/ansi.c.txt – starblue 2010-10-23 17:25:37

+2

鉴于缺乏空间,我假设他的意思是解析为令牌。无论如何,他的例子都没有一个有效的表达树。 – Dingo 2010-10-23 19:19:49

2

涉及的运营商是++,--,+-。一些括号和空格将帮助这里:

a = ((b++)++) + (b--) - (c--); 

我不知道解析是怎么工作的,但有 毫不含糊参与 (OK,还有就是,看到流浪者的答案),所以我想这是可以做到与像一些简单的规则:

  • 一个或多个字符组成的变量名,最简单的类型“表达”
  • 运营商+-的结合两个“表情”
  • 个运营商++--是一个后缀为“表达”

消除不确定性,你可以给++--更高的优先级比+-

+0

谢谢,但我想知道我如何能够自己解决这个问题。 – Moeb 2010-10-23 17:04:18