C++四大準則|無二義、高效性、合乎日常習慣、相似相同原則

2020-10-12 11:00:16

一、最高準則:無二義性

對該準則的理解

無二義是每一個計算機高階語言最為重要的原則,出現二義性的語句對計算機而言就是無法理解的語句。在程式設計過程中某一條語句如若不能保證排除二義性,那麼編譯器在編譯過程中將會報錯,其根本目的是確保程式碼無二義性以保證程式的正常執行

該準則的具體體現

1)運運算元的優先順序與結合性:
\\\C++針對輸入的語句進行處理時一定要有一個固定的處理順序,只有這樣才能保證在任何時間這條語句在C++中的意義是相同的。針對3+54這條語句,是應該先計算54再加3,還是應該先計算3+5再計算*5呢,如果不規定運運算元的優先順序,那麼結果就會產生二義性,顯然是十分不合理的。

int x = 3 + 5 * 4;
cout << x << endl;

此語句的結果只可能是23
\\\運運算元的結合性規定了語句讀取的方向,上述例子的結合性為從左到右。當然也存在結合性為從右到左的例子,如賦值運運算元單目運運算元條件運運算元
具體運運算元的優先順序結合性可見網址:
https://blog.csdn.net/qq_38131333/article/details/81674642
(2)識別符號不能數位開頭

double e = 3e3;

如果允許識別符號以數位開頭那麼 3e3 既可表示識別符號(變數名),亦可表示數值:3*10^3, 編譯時會顯示二義性

二、次高準則:高效性

對該準則的理解

高效性意味著在相同的時間內程式執行的更快,也意味著執行相同的程式所需要的時間和空間更少。C++產生之初,計算機的工作效率並不迅速,因此需要更高效的語言提高程式的執行速度。

該準則的具體體現

(1)陣列下標0索引。
是為了提高計算的效率,程式在取第i個變數的地址時,
0索引時:&a[i] = &a[0] + i * sizeof(a[0])
1索引時:&a[i] = &a[1] + (i-1)*sizeof(a[0])
很顯然1索引相對於0索引程式再取第i個變數的地址時多進行了一個減法運算,而再計算機中減法運算較為耗時,所以C++採用了陣列下標為0的索引來提高執行速度。
絕大多數程式語言,陣列都是1索引的,如C/C++,Java,Python,C#。
但也有語言是1索引的,最典型的就是MATLAB。
(2)邏輯短路
表示式1 || 表示式2,如果表示式1為TRUE,跳過對錶示式2的判斷,整個表示式的運算結果為TRUE。(短路和)
表示式1 && 表示式2,如果表示式1為FALSE,跳過對錶示式2的判斷,整個表示式的運算結果為FALSE。(短路與)
有效的減少了運算,提高了程式執行效率

三、第三準則:合乎日常習慣

對該準則的理解

在悠久的歷史長河中,人們形成了一套符合大多數人的行為習慣和思維模式。而計算機高階語言作為一個供人類使用的語言,當然需要在必要的地方儘可能的貼合人們行為習慣與思維模式。一方面可以提高人們學習計算機語言的速度,另一方面可以減少產生由日常習慣引起的程式碼錯誤。
一套背離人們日常習慣的計算機語言,無疑會給程式設計師的入門與程式設計帶來極大的不便性

該準則的具體體現

1)程式碼的書寫為從上至下,從左至右
2)某些特殊字元直接套用現實生活中的英文單詞(spacename、endl、if、break、cout等)
2)數學邏輯運算順序與實際匹配(乘除優先於加減)

四、第四準則:相似相同原則

對該準則的理解

現有物件A與B,A物件具有行為a,B物件具有行為b,如若行為a與行為b在形式與邏輯上有一定程度的相似性,那麼在C++語言中會對A物件增加一個行為b,對B物件增加一個行為a

該準則的具體體現

初始化:
1、等號初始化:

int a = 5;
int a = i;

2、括號初始化:

int a(5);
int a(i);

3、列表初始化:

int a{5};
int a{i};
int a = {5};
int a = {i};

括號初始化,是變數與物件之間的「相似相同規則」
列表初始化,是變數與陣列之間的「相似相同規則」