2010-10-23 50 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