C 程式語言的四個基本準則及其具體體現

2021-10-24 14:44:26 字數 2725 閱讀 3629

二義性是任何邏輯體系的最高準則,在c++中,如果出現定義、語句、邏輯自相矛盾時,程式便無法執行,數學界的三次數學危機,本質上就是為了消除「二義性」的爭端。

準則的具體體現:

(1) 運算子的優先順序與結合性。

優先順序是為了消除諸如3+4×5 的表示式,是應該被當作 (3+4)×5 還是3+(4×5)的二義性而設定的規則。

結合性是為了區別諸如a/b/c的表示式,與a/(b/c)的不同

示例**:

int  x = 3+4*5;
(2)識別符號不能以數字開頭

如果識別符號以數字開頭,那麼會和常量的定義產生衝突,例如無法判斷123是乙個變數還是常量。

(3)貪心規則

程式在讀取了乙個字元之後,會繼續讀取下乙個字元,直到不能產生意義之後再停止,當出現a+++b這樣的表示式時,程式會自動讀取為(a++)+b,因此這個表示式是有意義且可以正確執行的,貪心規則的使用使得該表示式並不會出現a+(++b)的情況出現。

示例**:

string stu_name_1;
(4)命名空間

c++中使用不同的命名空間可以對不同的變數進行區分,可以防止相同的變數名有不同的含義產生矛盾與衝突,也是為了消除變數的二義性。

(5)虛繼承

在多繼承的場景裡,當父類中存在同名變數時,子類訪問父類的同名變數,將出現二義性,因此在子類的變數前加virtual便可以實現虛繼承,便可以訪問父類中的同名變數。

示例**:

class a 

class b:virtual class a;

class c:public b;

int main()

如果有兩個行為a與b,均滿足無二義的規則,且a比b高效,則c++語言會選擇a行為作為標準語法。需要說明,並非所有語言,都有對高效性的絕對準求。高效性準則只對基礎的c++語法規則有效,在stl庫與模板中,已經不再是次高準則了。

(1)陣列下標0索引。

對於陣列中第i個元素的位址計算,當陣列下標從0開始時,a[i]的位址= 首位址 + i*資料長度;當陣列下標從1開始時,,a[i]的位址= 首位址 + (i-1)*每個資料所佔的長度,從0開始比從1開始少了乙個減法運算,提高了計算機的運算效率。

(2) 邏輯短路

邏輯短路規則為對於表示式a&&b 當a為假時,b不會計算 ,表示式的值為0。

(3) 標頭檔案」」和<>的使用

使用<>這種方式,編譯器查詢的時候,會在編譯器的安裝目錄的標準庫中開始查詢,如果找不到則在當前的工程所在資料夾中尋找,""這種方式,會在當前的工程所在的資料夾開始尋找,當頭檔案為當前工程所實現時,使用」」會增加效率。

(3)內聯函式

c++ 內聯函式是通常與類一起使用。如果乙個函式是內聯的,那麼在編譯時,編譯器會把該函式的**副本放置在每個呼叫該函式的地方。程式在編譯器編譯的時候,編譯器將程式**現的內聯函式的呼叫表示式用內聯函式的函式體進行替換,而對於其他的函式,都是在執行時候才被替代。因此內聯函式可以提高程式執行的效率,在類定義中的定義的函式都是內聯函式,即使沒有使用 inline 說明符。

第三準則的出現是為了給程式設計師的使用帶來便利,筆者的理解認為第三準則也有第二準則的原因所在,合乎日常習慣的**使用能夠從程式設計師自身實現高效性並將該程式語言繼續使用且發揚光大。

(1)賦值

整數可以給實數賦值,整型變數可以定義整型指標,字元型變數,可以定義字元型指標。這是合乎日常習慣的。

(2)陣列的定義

陣列的長度定義不能是變數,是因為在分配記憶體的過程中,如果陣列的長度定義是變數,則無法準確分配記憶體。如果要實現動態分配記憶體,可以使用new語句進行動態陣列的定義,也可以使用vector實現動態陣列,是採用了棧的方式。

(3)函式過載

函式過載中比較重要的是運算子過載,運算子過載是為了滿足日常生活中各個運算符號對於不同型別的資料都可以進行運算,例如可以實現虛數的加減乘除自增自減等,示例**如下:

class com

; ~com() =default;

com operator + (const com& com);

com operator - (const com& com);

com operator * (const com& com);

com operator / (const com& com);

com operator ++ ();

com operator -- ();

};

c++中,如果有兩個不同的物件a與b,a有行為a,b有行為b,如果a與b兩種行為在邏輯上具有相似性,則c++會為物件a額外增加乙個行為b,也會將物件b額外增加乙個行為a。

(1)變數初始化

c++中變數的初始化方式有三種,分別是等號初始化(a=1;a=b)、括號初始化(a(1);a(b);a=(1);a=(b))、列表初始化(a;a;a=;a=),其中,括號初始化是變數和物件之間的「相似相同規則」,列表初始化是變數和陣列之間的「相似相同規則」。

(2)引用初始化

c++中引用的初始化是引用和變數之間的「相似相同規則」,有以下幾種初始化方法:

示例**:

string &i=j;

stirng &i(j);

(2)陣列訪問形式

當指標指向陣列時,可以發現,通過指標來訪問,寫法是*(p+5)=1;通過陣列來訪問,寫法是a[5] = 1,根據相似相同原則,陣列可以使用*的寫法,而指標可以使用的寫法,一共有4種訪問形式。

C 程式語言的四個基本準則

二 次高準則 高效性 三 第三準則 合乎日常習慣 四 補充準則 相似相同規則 五 結語 對這個準則的理解 程式語言於計算機而言,通俗地說就是指令,若乙個指令出現歧義,計算機則會無法判斷該執行哪一種。倘若執行了其中一種,則可能與本來所需要的結果相悖,不符合實際需求。所以,程式語言的無二義性,可以使得我...

C 程式語言的四個基本準則

對這個準則的理解 這個準則,不僅是c 的準則,更是所有型別程式語言的最高準則。同一條c 語句不能同時具備兩種或多種含義,每一條c 語句只能通過一種方式執行,得到唯一結果。準則的具體體現 1 運算子的優先順序與結合性。優先順序是為了消除如5 6 7的表示式,是應該被當作 5 6 7還是5 6 7 的二...

C 程式語言的四個基本準則

理解 同一條語句不能具有兩種及以上的含義,否則將導致語句的執行過程發生衝突。體現 1 運算子的優先順序與結合性 運算子優先順序的產生,是為了消除運算過程中可能產生的歧義。例如加法和乘法兩種運算到底誰先進行。int a 1 2 3 乘法優先於加法進行運算,輸出7,而不是9 2 識別符號不能以數字開頭 ...