由C 中的自增 自減運算子引發的思考

2021-05-25 02:10:15 字數 1913 閱讀 9648

今天看到csdn上又有初學c++的朋友問到c++中自增、自減運算子字首、字尾形式的運算子使用的問題,覺得這個問題很普遍的,應該問到的挺多的,這麼多年在考試題、面試題中幾乎是個必考的問題,先不去說相關的知識點,我就想看一下關於這個問題討論的現狀,結果發現很多人討論得還挺「深入」。

比如:

int n=0, m=0;

i= (n++)+(n++)+(n++);

j = (++m)+(++m)+(++m)

k=-i++;

字尾運算:

(1)j=(5,6,(i++)+(i++)+(i++)): j=9(3+3+3)

(2)j=(k++,6,(i++)+(i++)+(i++)): j=9(3+3+3)

(3)j=1?(i++)+(i++)+(i++): 0: j=9(3+3+3)

(4)j=i?(i++)+(i++)+(i++): 0: j=12(3+4+5)

(5)j=k++?(i++)+(i++)+(i++): 0: j=12(3+4+5)

字首運算:

(6)j=(5,i,(++i)+(++i)+(++i)): j=18(6+6+6)

(7)j=(5,k++,(++i)+(++i)+(++i)): j=15(4+5+6)

(8)j=1?(++i)+(++i)+(++i): 0: j=18(6+6+6)

(9)j=1?(k++,(+i)+(++i)+++i)): 0: j=15(4+5+6)

(10)j=k++?(++i)+(++i)+(++i): 0: j=15(4+5+6)

int b=a++*++a*a++*++a;

printf(「%d, %d, %d」, n++, n ++n);

且不去管這些問題有多難,標準如何定義、編譯器如何實現、編譯器是否有bug、編譯器對標準的實現程度等等一素列可能影響這些問題的因素,我們挨過來考慮幾個問題:

1) 這種表示式有沒有實際的應用場景?

2)這種複雜的表示式是否可以簡化成其它表示式?

3)這種方式比其它形式的同效果**有什麼優勢?

對於第乙個問題,我能想到的場景就是考試(包括學校和應聘筆試),除了考試我還真就沒有見過實際使用這麼複雜表示式的,除非有人想表現一下讓人覺得他是高手,但實際上可能聰明反被聰明誤。比如i= (n++)+(n++)+(n++),**有可能用到呢?即使標準中明確規定了其行為、編譯器也是按照標準實現的,但別忘了,編譯器也是軟體也是人編寫出來了,它同樣可能存在各種各樣的bug,即使目前的編譯器版本沒有問題,也不能保證以後哪天編譯器公升級了,或者換了編譯器你的**還好用。

對於第二個問題,答案是肯定的。自增與自減運算子本身就可以被替換成+與-運算。

那就應該考慮第三個問題了,這什麼優勢嗎?除了上面說的寫**的為了顯擺一下自己的「技術」沒有什麼優勢,只能使**的可讀性很差,維護起來更困難,即使**是正確的,而且不會因為編譯器帶來不確定的行為,那麼讀的人是不是也能夠一眼看出來**的意圖呢?如果不能,就是說你的**可讀性差了。

至於效率,++與--除了編碼效率高一點,少敲幾個字元,並不能給執行時帶來效能上的提公升,其實也不能節約多少編碼時間。

所以,在工程上還是不要使用包含++或--的太複雜的表示式,而考試出題出太複雜也是沒有什麼意義,只要知道j=++i與j=i++執行結果的不同也就足夠了,建議出題的老師門也不要再出這種沒有意義的考題了,出這樣的題與研究這樣的題同樣沒有意義,只是在浪費時間,浪費自己的時間,同時也是浪費應試者的時間。

類似的問題又想到運算子結合順序的問題,比如對於指標pi,*pi++是(*pi)++還是*(pi++)等,諸如此類問題,研究這種題同樣沒有意義,在工程上強烈建議還是把括號加上。我是比較懶的,結合順序我一直記不住,所以我的**都是帶有括號的,比如 a || b && c,還是要寫成a || (b && c)看起來更直觀,可讀性好些。

想成為高手還是研究點兒有意義的問題,作為出題者還是出點兒有意義的題,總之還是要做點兒有意義的事兒。

自增自減運算子

自增自減運算子 i 先使用i,然後i i 1 i 先使用i,然後i i 1 i 先i i 1然後使用i i 先i i 1 然後使用i 以下使用vc下除錯的結果,不同的編譯器可能有不同的結果。i 3 例1printf d i 結果輸出4 例2printf d i 結果輸出3 例3printf resu...

自增 ,自減 運算子

自增1運算子記為 其功能是使變數的值自增1。自減1運算子記為 其功能是使變數值自減1。自增1,自減1運算子均為單目運算,都具有右結合性。可有以下幾種形式 i i自增1後再參與其它運算。i i自減1後再參與其它運算。i i參與運算後,i的值再自增1。i i參與運算後,i的值再自減1。在理解和使用上容易...

C 基礎 自增自減運算子

注 當自增自減運算子所在的表示式或語句中只含一種操作時 即單一表示式 則其字首和字尾功能對程式的作用時一樣的 而當含有兩個或兩個以上操作時,在考慮各個運算子的優先級別和結合性的基礎上,則其字首和字尾的功能對程式的作用時不一樣的。1 為了提高程式的效率,需要用技巧把程式寫得盡可能簡潔一些,但這樣有可能...