簡單聊聊c/c++新手常犯的錯誤

回顧這幾年學習編程有感而寫

熱身

對很多CS專業的同學來講,C語言 會是你們接觸的首門編程語言。之後可能會進階難度更大,經過面向對象擴充的C++,或其他什麼高級面嚮對象語言。在這之前,可能你完全是個新手,還沒怎麼正式接觸過編程。作爲一名一路走來的老司機,我想跟大家聊聊我當年入門編程時遇到的一些坑,希望我的文章能爲你保駕護航,使你免於翻車。

我深知讓編程新手們最痛苦的事便是調試代碼時被 IDE 高亮提示的滿屏錯誤給閃瞎了眼(多數新手最初的幾行代碼可能始於獨立的編輯器,比如筆者在 Win 上必備的 NotePad++ 等等。還有就是新手們最常犯的一般是語法錯誤)。這其實很正常,可能你現在連盲打都不熟練,可能你現在只對 WSAD 和 IJKL 這幾個按鍵比較熟練,什麼面向過程,面向對象,甚至面向函數等等概念你都還搞不清楚……彆着急,後面的路長着呢,長到足夠你適應用十根手指敲擊所有按鍵,長到你不會再被語法錯誤所困擾(因爲有更麻煩的邏輯錯誤在前方等着你,等到被邏輯錯誤折磨成爲常態的那天,你會覺得自己再偶爾犯個語法錯誤是件很可愛的事~)。

正題

下面我們直接切入正題:
首先本篇文章格局較小,我只以 C語言 爲討論對象聊一些 C語言 新手們常犯的錯誤(主要是語法錯誤),後面會涉及一些編程新人們應該具備的基本思想覺悟。另外,本篇文章所討論的內容十分初級,對編程新人來說可能比較受用,但對老司機可能太過淺薄!不過老司機讀這樣的文章興許也能勾起一些早年的學習回憶,希望能博君一笑。下面開始分點討論:

1. 忘寫分號

在 C語言(包括很多 類C語言)裏,讓很多新手們感覺最反人類的一點大概就是每條語句結尾要以分號 “;” 標示,而對這個超級重要的分號,萌新們初期通常是能忘寫就忘寫……這樣的低級錯誤單獨拿出來說可能顯得很滑稽,然而你仔細回想下,你現在或當年確實經常把人家分號給忘掉,對嗎?

其實還好,基本上代碼寫多以後就不存在這樣一個低級錯誤了。初期你可能要先忍受下因爲少寫了一個分號導致編譯不通過的尷尬情況,彆着急,回頭補上可能編譯器就給你通過編譯了。說來,這也是最容易排查的一個錯誤你說是吧。

#include <stdio.h>
void main(){
    printf("Hello World!\n");  //注意分號
}

2. = 和 == 混淆

新手們通常需要一點時間才能理解編程語言中的賦值運算符,敲黑板了!!!注意字符 “=” 在大多數編程語言中是個跟你往常經驗有所不同的重要符號,一般被我們稱之爲“賦值運算符”。這是一個在編程中非常重要的運算符。它具有右結合性,計算的時候是先計算出表達式右邊的值,然後再把計算好的右邊存儲的值賦予左邊的變量。計算完成後左右兩邊其值自然是相等的。注意這個符號的左邊只能是變量,因爲只有變量纔可以被賦值。不要試圖把一個常量放在賦值運算符的左邊,這會通不過編譯的!

“==” 是關係運算符的一種,我們使用這個符號來判斷左右兩邊表達式的值是否相等,其結果是個邏輯值。當然在 C語言 中因爲沒有提供布爾型數據,所以我們只是簡單地用整數 1 來表示 True ,用整數 0 來表示 False。

#include <stdio.h>
void main(){
    //下面三句都是賦值操作
    int a=1;
    int b=2;
    a=b;
    //下面的括號裏是使用關係運算符的關係表達式,此處用來比較兩個變量的值是否相等,這裏是相等的,返回整數 1
    int c=(a==b);
    printf("%d",c);
}

你可能會奇怪我爲什麼要把這兩個基本運算符放一起說道,別急。據我經驗,這裏也有個新手頻繁翻跟頭的大坑,那就是容易把這兩個運算符搞混。

最常見的一個誤操作,就是在進行兩個表達式值比較的時候,本來正確的關係表達式應該是 a==b ,然而新生們可能會誤寫爲去判斷 a=b ,這……這個錯誤筆者在今天也會偶爾犯!所以啊,新人們一定要好好跟着兩個重要的運算符認識清楚,確保在使用的時候不會混淆,謹記!

3. 注意語言的保留關鍵字

這個就很容易理解了,新手們普遍敲的代碼比較少,注意一些語言的保留關鍵字一定要敲對了,避免拼寫錯誤。有時候一個鍵入錯誤的關鍵字會報一些難以理解的錯誤,一定要儘量避免。還有就是變量命名的時候不要使用語言的保留關鍵字,你懂的!下面貼一下 C語言 的保留關鍵字,內容來自互聯網:

其中,C89中,(C語言標準)中
類型說明保留字:int,long,short,float,double,char,unsigned,signed,const,void,volatile,enum,struct,union
語句定義保留字:if,else,goto,switch,case,do,while,for,continue,break,return,default,typedef
存儲類說明保留字:auto,register,extern,static
長度運算符保留字:sizeof

4. 成對符號一定要包住

所謂成對符號,指的是隻要出現一定是成對出現的那些符號。比如常見的各種括號,在 C語言 裏主要有花括號 {},方括號 [],圓弧括號 (),這三個最爲常見。其他的成對符號還有引號,主要有雙引號和單引號。成對符號常見的差不多就這些,這裏說的成對符號一定要包住是指成對符號一定要成對出現。比如你不能只寫一個花括號的其中一半 “{”,而把另一半 “}” 給忘了。這其實也是個典型的低級錯誤,之所以單獨拿出來講是因爲當程序寫的複雜起來嵌套結構變多之後這些成對符號很容易寫着寫着就把另一半給忘掉了。有時候,在嵌套結構多的程序段裏一組成對符號沒包住會出現些匪夷所思的錯誤提示,這基本是新人們最容易翻跟頭的地方,大家一定要小心!

5. 對某些概念不要鑽牛角尖

初學者在初期接受一些概念性東西的時候往往容易陷入鑽牛角尖而不得的尷尬境地,比如 C語言 裏的指針。指針應該是令 C語言 初學者最爲困擾的一個概念,因爲這是 C語言 中一個完全抽象性的概念 。所謂抽象性概念,一定要用你的抽象思維去理解,很多抽象性概念是不容易具象表達出來的。

往遠一點說開去,所有的高級語言其實都是計算機和人之間隔着的一層抽象關係。要知道計算機內部實現邏輯是很抽象的,它內部只認識 0 和 1 ,而我們的現實世界是很複雜的。計算機就是發明出來幫我們人類處理現實問題的,而現實問題映射到計算機裏只能簡化成二進制的 0 和 1 來表示,進而去計算。編程語言在這裏所起到的作用其實就是連接計算機的內部抽象實現和我們人類的抽象思維,說到這裏,你的抽象思維還算過關嗎?

具體到指針這個概念,其實初學者不用在初學階段去死磕它到底是什麼,只需要記住課本上一句關於指針的描述性概念:一個變量的地址稱爲該變量的指針。目前記住這句話就夠了。

6. 學習要沉得住氣,切勿心浮氣躁,急於求成

本篇文章主要是面向大學 CS 專業新生羣體裏的編程初學者聊一些過來人的經驗。當然你即使不是大學新生,只要滿足編程初學者的設定,本篇文章所聊到的東西對你來說仍然是適用的。到文章末尾了,我最後再說一下要做好編程這件事應該具備的一些心態,以及給新人同學們的一些寄語。

可能你在學習了很長一段時間後成果仍僅限於在黑洞洞的終端窗口輸出一些看似意義不大的字符。你可能會懷疑,會動搖,自己的努力彷彿都是無意義,或者說無用的。畢竟,在終端窗口裏輸出一句 Hello World ! 這件事從表面上看確實沒什麼意義。你可能會想當然地覺得編程這件事本身就沒什麼意義,能解決的好像都是些無用的問題。其實要解決這個疑惑涉及到的問題很深刻,甚至牽扯到編程的本質是什麼這種元問題……好啦扯遠了!我非常理解這些疑惑,因爲我也曾一度被這樣的問題困擾着。其實基礎的編程教學都不會教初學者玩 GUI,就是圖形用戶界面。但編程最基礎的,也是最本質最需要解決的東西,就是“如何高效快速地算出兩個數相乘之積”這些看似簡單的問題。給一些具體問題套上 GUI,問題會變得更爲複雜點,但拆開來看仍是由很多很多“如何高效快速地算出兩個數相乘之積”這些看似簡單的問題組成的。那些複雜花哨的 GUI 程序,起點都是“如何在終端打印 Hello World !”,“如何高效快速地算出兩個數相乘之積”,這些簡單的問題!所以,年輕人,學習要沉得住氣!學校教的,或者說基礎教學教你的,都是看似簡單,卻基礎重要的多的東西。越是基礎的東西,就越是不容易過時,越是你應該珍惜,會使你終身受用的東西!

完!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章