第1部分 重新認識C語言
學校C語言教材的缺陷
我在走出校門的時候非常的“輕狂”,認為自己在學校裡面已經學得夠多了,工作就隻算是小菜一碟。但在工作中屢次碰壁之後,我才發現自己當時的想法是多麼的天真。我們踏上工作崗位,一切幾乎都要從零開始。
對于大家“非常熟悉”的C語言來說,我們在學校裡面學的非但不夠用,而且在很多地方對大家還有“誤導”的作用,讓我們認為程式設計就是那麼一回事了。
我舉某知名C語言教材中的“函數”那一章的某程式為例子加以說明。程式如下:
對于以上程式,至少存在以下問題:
第一,變量命名不規範,而且沒有初始化。對于該程式,main函數裡的變量n、y,fac函數裡面的變量f的命名均不規範,不能讓人一眼就看出它是什麼意思、要做什麼操作。這對于一小段程式來說,影響還不是很大,但如果代碼行數達到數千行,那麼閱讀起來就比較的費力。另外,以上說的三個變量隻是定義了,并沒有初始化,這在實際項目中也是不允許的。
第二,函數的命名不規範,且沒有在主函數開始之前進行聲明。本程式中的fac函數表示什麼意思?如果你沒有看程式開始之前的文字,那麼隻有通過閱讀函數裡面的代碼才能知道。在實際項目中,函數命名非常的重要,因為一般涉及到函數個數較多,如果不能通過函數名稱來了解其作用,而必須通過閱讀代碼才能獲悉,那麼工作效率是很低的。此外,我們一般不在調用該函數的函數的内部來對被調函數進行聲明,而是應該将聲明放在外部,最好建立一個頭檔案來對程式裡面出現的函數進行聲明。
第三,程式代碼排版不工整,“if…else”語句書寫不規範。在fac函數中,存在排版不工整的情況。第一個if語句下面的大括号應該與“if”的“i”保持在同一列上,第二個“else”應該與第二個“if”保持在同一列上,“f=1;”和“f=fac(n-1)*n;”應該再縮進4個空格。另外,“if”和“else”下面的執行語句不管有多少行,都應該用“{}”括起來,以友善閱讀。
第四,程式注釋過少,函數開頭沒有注釋。一般說來,在程式的關鍵語句的前面或右邊,都應該添加适當的注釋,這對程式的了解有輔助的作用。函數fac的前面應該加注釋,說明此函數的功能、輸入/輸出參數、傳回值、修改記錄等。在整個程式的開頭處,也要添加版本資訊、修改記錄等注釋資訊,以友善日後查閱。
第五,程式中出現了“printf”、“scanf”和“main”函數。這是大家都習以為常的,但在實際的項目中,幾乎不可能出現這三個函數。因為公司都有自己的開發平台,而且代碼都達到數千行,甚至上萬行,大部分都不是基于VC開發的,你在哪裡去輸入,又在哪裡去看輸出呢?我一進公司,最開始看到程式,就想去找“printf”、“scanf”和“main”,但這是徒勞的,因為根本就沒有。關于輸入/輸出,開發中會有專門的消息處理流程來處理,大家需要知道的就是一個完整的程式不一定非要有上面的三個函數。
短短的幾十行代碼,就出現了這麼多大家“沒有想到”的問題。
看到以上的分析,也許你會很驚慌:我以前的C語言難道是白學了?
非也!我舉這個例子,一不是為了亵渎經典,二不是為了給大家當頭一棒。我隻是想說明,對于C語言,我們還有很多不知道的東西,即使是自己知道的,也與實際工作存在較大的偏差,大家要虛心學習。我和大家一樣,也經曆了最開的惶恐階段,而後才逐漸去改變了自己“根深蒂固”的觀念。“知錯能改,善莫大焉”啊!
雄關漫道真如鐵,而今邁步從頭越!