C 小技巧之貪婪匹配

2021-05-17 12:20:57 字數 776 閱讀 3535

相信很多c/c++初學者在教科書或者考試中遇到過這樣的問題,下面的**輸出值為多少:

很多人都很迷惑,三個加號在一起,到底是(a++) + b呢還是a + (++b)呢?我當時也很迷惑,自己寫程式執行一遍,發現,a=1 b=1。這才知道是(a++) + b,可沒幾天就忘了。。。我記性不好。。。

最近看了看herb sutter的exceptional c++系列,發現有一種所謂貪婪匹配的方法可以簡單的分析這一類的問題。

「貪婪匹配」原則是說編譯器在原始碼解析的時候遇到乙個個的標記(token)時,會使用一種貪婪匹配演算法,也就是讓盡可能讓乙個標記包含更多的字元。

按照這個原則,編譯器在解析a+++b這個表示式的時候,會將前兩個+號組合在一起,變成乙個後置遞增運算子,這樣計算出來確實a=1 b=1。

怎樣,是不是很簡單?

簡單是很簡單,但也會導致一些問題,比如如下**:

template>

按照常理來說,這是乙個模板定義,並且模板引數含有預設引數,但貪婪演算法會將最後兩個》解析成流提取操作符,從而導致編譯失敗。所以,如果你看過stl的原始碼,在這種情況下會這麼寫:

template>

>>中間加乙個空格,這樣編譯器就不會使用貪婪演算法匹配了。當然這是針對微軟visual c++系列編譯器來說的。據說c++builder沒有這個問題。

如果不用空格隔開,並且注釋中的不算,那麼乙個合法的c++程式中最多能包含多少個連續的一下字元:

(1)&

(2)<

(3)|

對於看過該書的同學們,再回顧一下,沒看過的仔細考慮一下吧。。。

C 小技巧之CONTAINING RECORD

containing record是乙個在c 程式設計中用處很大的一種技巧,它的功能為已知結構體或類的某一成員 物件中該成員的位址以及這一結構體名或類名,從而得到該物件的基位址。由於寫法簡單,它被當做乙個巨集來使用,寫法是這樣的。define containing record address,ty...

C 開發小技巧之筆記

一 vc2008如何將lib檔案引入 lib引用有兩種方法 1.pragma comment lib,opengl32.lib 2.選擇project xx properties.linker input additional dependences,在其中加入lib檔名即可。注意要放到工程目錄下。...

正規表示式 匹配原理之貪婪與非貪婪

只因貧道學習爬蟲,爬網頁的時候總也得不到想要的結果,故而baidu一番,但是晦澀難懂,便根據自己心得留下只言片語,靜等有緣人 我所理解的貪婪和非貪婪模式,是用於正則中多次匹配元素時的取值方式。以下使用貪吃蛇的方式說明 1.貪婪模式 只要能完成正規表示式,能吃多少吃多少,不怕胖 2.非貪婪模式 只能能...