1. 程式人生 > >找工作筆試面試那些事兒(1)---C,C++基礎和程式設計風格(1)

找工作筆試面試那些事兒(1)---C,C++基礎和程式設計風格(1)

前言

    眼看著又要到一年一度的找工作季了,遙想去年這會兒,學校同學們也都是一副要上戰場似得枕戈待旦整裝待發的情景。想來自己當時筆試面試也確實參加了不少,無奈技術和智商平平,最後結果一般,但也確實經歷了不少,外加一直有總結和整理資料的小習慣,手頭上確實攢下了一些筆試面試的資源。又最近頻繁有師弟師妹問我要相關的資料,想來還不如自己整理整理髮到部落格裡,大家都能看看,希望能有一些幫助吧。

第一部分 C/C++程式設計基礎

    這部分內容大部分來自林銳博士01年寫的高質量C++/C程式設計指南,距今已經十多年了,但是我依舊清晰地記得師兄當初介紹這本幾十頁的書給我,看後的驚豔,確切的說來,這本書讓我的程式設計風格程式設計習慣以及對C++/C的認識有了大的提升(這個說來尷尬了,本人屬於木有任何天賦的程式設計師,和大牛們差幾百個檔,之前寫的程式只能用慘不忍睹來形容,即使現在可能也只屬於勉強能看)。直至後來參加大大小小的筆試面試,發現裡面考察略深一點點的C++/C基礎知識在書裡面都能看到;而後來參加某網際網路公司面試,當場寫演算法程式時,被面試官誇過程式設計習慣和程式設計風格非常好(介個,其實也有可能是剛好對上面試官胃口罷了...),我再一次意識到,這份資料確實是不錯的,所以這裡打算整理整理,發到部落格上共享一下,已經看過和熟知的童鞋或者大牛們自行繞開吧。

今天寫的這部分,大體上都是關於程式設計風格和程式設計習慣的,C/C++基礎和注意點下次再說吧。

正題

一、檔案結構

1.1版權版本宣告

       我看過一些寫的比較詳細正統的標頭檔案和定義檔案的開頭都有這部分。具體包括以下內容:

       1) 版權資訊。 

       2) 檔名稱,識別符號,摘要。 

       3) 當前版本號,作者/ 修改者,完成日期。 

       4 )版本歷史資訊。 

1.2 關於標頭檔案

       1)為了防止標頭檔案被重複引用,應當用ifndef /define/ endif 結構產生預處理塊。

       2)用#include <filename.h>  格式來引用標準庫的標頭檔案,用#include “filename .h”格式來引用非標準庫的標頭檔案。

       3)標頭檔案中只存放“宣告”而不存放“定義”。

       示例:

       #ifndef GRAPHICS_H  //  防止graphics.h 被重複引用 

       #define GRAPHICS_H 

       #include <math.h>    //  引用標準庫的標頭檔案 

       … 

       #include  “ m yheader.h”   //  引用非標準庫的標頭檔案 

       … 

       void Function1( …); //  全域性函式宣告 

       … 

       class Box         //  類結構宣告 

       { 

       … 

       }; 

       #endif

1.3 標頭檔案作用

       1) 通過標頭檔案來呼叫庫功能。

       2) 標頭檔案能加強型別安全檢查。

二、程式的板式

2.1空行

       建議:

       1)在每個類宣告之後、每個函式定義結束之後都要加空行。

       2)在一個函式體內,邏揖上密切相關的語句之間不加空行,其它地方應加空行分隔。

       實力如下圖左右所示:

2.2 程式碼行

       建議:

       1)一行程式碼只做一件事情,如只定義一個變數,或只寫一條語句。這樣的程式碼容易閱讀,並且方便於寫註釋。

       2)if、for、while、do等語句自佔一行,執行語句不得緊跟其後。不論執行語句有多少都要加{}。這樣可以防止書寫失誤。

       例下圖中左側為風格良好的程式碼,右側為風格糟糕的程式碼。

       3)儘可能在定義變數的同時初始化該變數,以減少安全隱患。

2.3 程式碼行內的空格

         1)關鍵字(const、virtual、inline、case、if、for、while)之後要留空格。而函式名之後不要留空格,緊跟左括號‘(’,以與關鍵字區別。 

         2)‘(’向後緊跟,不留空格;‘)’、‘,’、‘; ’向前緊跟,不留空格。‘,’、‘; ’後接空格。 

         3)二元操作符(“= ”、“+=”  “>=”、“<=”、“+ ”、“* ”、“% ”、“&&”、“|| ”、“<<”, “^ ”)前後應當加空格。 一元操作符(“! ”、“~ ”、“++”、“-- ”、“& ”)前後不加空格。 

         4)對於表示式比較長的for 語句和if 語句,為了緊湊起見可以適當地去掉一些空格,如for (i=0; i<10; i++) 和if ((a<=b) && (c<=d)) 

       示例如下:

2.4 對齊

       1)程式的分界符‘{ ’和‘} ’應獨佔一行並且位於同一列,同時與引用它們的語句左對齊。

       2){ }之內的程式碼塊在‘{ ’右邊數格處左對齊。

2.5 修飾符的位置

     這裡的修飾符主要指 * 和 &,事實上關於它們應該靠近資料型別還是變數名,一直都有爭議。將修飾符 *  靠近資料型別,例如:i nt*  x;  比較直觀,但同時在某些情況下也容易引起誤解(例i nt*   x, y中的y容易被誤解為指標變數)。所以這裡:

       建議大家在寫程式時將修飾符 * 和 & 緊靠變數名。

       所以:

       int  *x,  y;  //  此處y不會被誤解為指標

2.6 註釋

     C 語言的註釋符為“/*… * / ”。C++ 語言中,程式塊的註釋常採用“/*… * / ”,行註釋一般採用“//… ”。註釋的主要作用是:

       2)函式介面說明; 

       3)重要的程式碼行或段落提示

       一個示例如下圖所示:

三、命名規則

    關於變數和函式等的命名,程式設計師會有自己的認識和習慣,沒有一種命名規則可以讓所有的程式設計師贊同,重要的是要保持一致的風格。這個地方,比較著名的一種寫法是Microsoft公司的“匈牙利”法。

       主要命名規則總結如下:

       1)類名和函式名用大寫字母開頭的單詞組合而成。

       例如: 

       class  Node;     //   類名 

       class  LeafNode;    //   類名 

       void  Draw(void);      //  函式名 

       void  SetValue(int value); //  函式名

       2)變數和引數用小寫字母開頭的單詞組合而成。

       例如: 

       BOOL flag; 

       int  drawMode; 

       3)常量全用大寫的字母,用下劃線分割單詞。

       例如: 

       const int MAX = 100; 

       const int MAX_LENGTH = 100;

       4)靜態變數加字首s_ (表示static)。 

       例如: 

       void Init(…) 

       { 

         static int s_initValue;  //  靜態變數 

        … 

       }

       5)如果不得已需要全域性變數,則使全域性變數加字首g_(表示global )。

       例如: 

       int g_howMany People;  //  全域性變數 

       int g_howMuchMoney ;   //  全域性變數 

       6)類的資料成員加字首m_(表示membe r ),這樣可以避免資料成員與成員函式的引數同名。

       例如: 

        void Object::SetValue(int width, int height) 

        { 

              m_width = width; 

              m_height = height; 

        }

       有以下共同規則:

       1. 識別符號應當直觀且可以拼讀,可望文知意,不必進行“解碼”。用詞要恰當,莫把CurrentValue 寫成NowValue 。

       2. 識別符號的長度應當符合“min-length && max-information”原則。即最短的程度表達最多的資訊。

       3. 命名規則儘量與所採用的作業系統或開發工具的風格保持一致。例如Windows中用AddChild。而Unix 中用add_child 。

       4. 程式中不要出現僅靠大小寫區分的相似的識別符號。例int  x,  X; void foo(int x)和void FOO(float x)是不好的命名方式。

       5. 變數的名字應當使用“名詞”或者“形容詞+名詞”。例float  oldValue;和float  newV alue;

       6. 全域性函式的名字應當使用“動詞”或者“動詞+名詞”(動賓片語)。例DrawBox(); box->Draw(); 

       7. 用正確的反義片語命名具有互斥意義的變數或相反動作的函式等。例                     int minValue; int maxValue; int SetValue(…); int GetValue(…);

--------------------- 本文來自 寒小陽 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/han_xiaoyang/article/details/10473845?utm_source=copy