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