1. 程式人生 > >讓你提前認識軟體開發(3):學校C語言教材的缺陷

讓你提前認識軟體開發(3):學校C語言教材的缺陷

第1部分 重新認識C語言

學校C語言教材的缺陷

        我在走出校門的時候非常的“輕狂”,認為自己在學校裡面已經學得夠多了,工作就只算是小菜一碟。但在工作中屢次碰壁之後,我才發現自己當時的想法是多麼的天真。我們踏上工作崗位,一切幾乎都要從零開始。

        對於大家“非常熟悉”的C語言來說,我們在學校裡面學的非但不夠用,而且在很多地方對大家還有“誤導”的作用,讓我們認為程式設計就是那麼一回事了。

        我舉某知名C語言教材中的“函式”那一章的某程式為例子加以說明。程式如下:

#include 
void main()
{
    float fac(int n);
    int n;
    float y;
    printf("input an integer number: ");
    scanf("%d", &n);
    y = fac(n);
    printf("%d!=%10.0f\n", n, y);
}
float fac(int n)
{
    float f;
    if(n<0)
      {
    printf("n<0, dataerror!");
}
        else
              if(n == 0 || n == 1)
              f=1;
        else
              f=fac(n-1)*n;
        return(f);
}

         對於以上程式,至少存在以下問題:

         第一,變數命名不規範,而且沒有初始化。對於該程式,main函式裡的變數nyfac函式裡面的變數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語言,我們還有很多不知道的東西,即使是自己知道的,也與實際工作存在較大的偏差,大家要虛心學習。我和大家一樣,也經歷了最開的惶恐階段,而後才逐漸去改變了自己“根深蒂固”的觀念。“知錯能改,善莫大焉”啊!

        雄關漫道真如鐵,而今邁步從頭越!