【C语言】C语言里++能随便用吗?
一.問題提出
在Blink區(qū)看到這么一個問題:
#include <stdio.h>int main() {int a = 3;printf("%d %d %d %d %d\n", a++, ++a, a++, ++a, a++);return 0; }運行結(jié)果(猜測):
3 5 5 7 7最終a的值為8。
這看起來是一個美好的結(jié)果,但是這樣是對的嗎?
我們來看一看MinGW的gcc編譯器下的運行結(jié)果:
下圖為證:
確實如此,這個結(jié)果我測親測,也與那位提問者提供的相符,但這使人很困惑是吧,我決心略微進(jìn)行一下探究,講出我的一些拙見。
二.最基本的情形的查看
- 分別處理
- 合起來簡單處理
可見,將二者分開、不在同一個printf()里就會得到預(yù)期的結(jié)果,否則會出現(xiàn)“意外情況”。
三.對上述基本情況的分析研究
1.分別處理。
我們試著將一條語句拆成兩行,按照不同的先后順序執(zhí)行,就得到了上面的結(jié)果。這證明單獨運行不會出現(xiàn)預(yù)料之外的“異常情況”。
2.合起來簡單處理。
把++放在printf()之外,得到我們原本預(yù)期的結(jié)果而非問題遇到的情況。這說明問題可能出在printf()里的多個++上(極有可能是編譯問題)。
四.歸納分析
繼續(xù)做測試,一步一步地增加測試:
上面的逐步歸納基本成型,我們可以設(shè)計另一個例子,進(jìn)一步驗證:
int i = 1;printf("%d", (++i)+(++i));上面代碼運行結(jié)果是
6可見gcc可能是這樣工作的(資料引用):
++i; ++i; i = i + i; // ---> 6五.得到結(jié)論
我不能說我很了解這里的知識,就只能說我根據(jù)實驗歸納得到了下面的結(jié)論(僅限本問題):
輸出序列中,++a對應(yīng)的全是a的終值,a++對應(yīng)的需要從右往左數(shù)依次是a、a+2、a+4、……
六.總結(jié)
這個問題本來覺得很有趣,跟一些大佬探討了一下。
大佬們均并不建議我深究,說應(yīng)該是C編譯器的問題,更是有一位給了我上文中的鏈接,讓我進(jìn)一步體會到問題可能真的源自編譯器。
也問了一位大學(xué)老師,給出的回復(fù)是:
(1)如果是在做選擇題,建議跳過(實際上我并沒有做選擇題)。
(2)如果是寫程序,建議避免這么使用(實際上我不喜歡使用)。
實際上,我確實不喜歡濫用++的代碼,大量的++在我看來固然方便了編寫簡潔的代碼但也降低了可讀性,也可能由于某種疏漏引發(fā)沒必要的Bug。
再講講問題本身。
看到這個問題我是比較頭痛的,因為熟悉我的人可能知道,我是Python起步編程,Java正式學(xué)成體系的(比起各位大佬還是非常菜的),后面出于種種緣由才邂逅了各種美妙的編程語言。C語言我并非不懂,但也并不是我的強(qiáng)項,但還是覺得應(yīng)該人有一種探究精神且不能過分拘泥于自己的舒適區(qū),這也算我自己認(rèn)定的一種自我追求與自我修養(yǎng)吧。
我現(xiàn)在隨著理解的深入,有些問題已經(jīng)不可避免的接觸到我的痛點,想來也只能迎難而上、風(fēng)雨無阻,誰叫我以作為一名進(jìn)階的Java碼農(nóng)為榮呢?(哈哈,Python真香)
如對本問題有更深的理解,可以留言,感謝。
2021-02-05更新
吐槽!
現(xiàn)在很多計算機(jī)的基礎(chǔ)C教育往往把++這種東西看的太重,其實真的不好,我覺得這是在誤導(dǎo)人。
我覺得編程學(xué)的比較不錯的人不應(yīng)該是背書背代碼背規(guī)則的庸才,能流暢地編程并快速的學(xué)會一樣新鮮的技術(shù)的人是更好的,可惜……
之前就有什么i+++++i之類的睿智代碼,吐了……無語子……
比如下面這種代碼,常考,要是你自己整天寫這種代碼的話,呵呵,純屬給自己惹麻煩。
#include <stdio.h>int main ( ) {int a,b,k;k=(a=2,b=5,a>b?a++:b++,a+b);printf("k = %d\n", k); }總結(jié)
以上是生活随笔為你收集整理的【C语言】C语言里++能随便用吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 质因数分解(洛谷P1075题题解,Jav
- 下一篇: 搞了多年管理软件,总算说清楚了什么是好软