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