2.次高準則---高效性
2.2.6 遞增運算子
3.第三準則---合乎日常習慣
4. 第四準則---相似相同原則
即一串**只可有一種執行方式,在語義上和邏輯上不能有歧義,這同時也是所有程式語言所要遵守的最高準則。
-優先順序是為了解決語句運算中運算子使用的先後問題。
如: int i = 3 + 4 * 5; 是(3+4)×5還是3+(4×5) .
-結合性是為了解決當運算子優先順序相同時運算元的結合性時從右向左還是從左向右的問題。
如: int j = 120 / 4 * 5; 是(120/4)×5還是120/(4×5).
一些常見運算子優先順序
運算子結合律
()從左往右
+ - (一元)
從右往左
* /從左往右
+ - (二元)
從左往右
=從右往左
不能用關鍵字當作識別符號(如變數名),否則,編譯器將視之為語法錯誤。
不可以用數字作為名稱開頭。因為這樣將無法判斷像10e3是變數名還是數字常量,違反了無二義準則;且若以數字開頭,則要遍歷後續字元,才可判斷是否為數字常量,降低了編譯的速度,也違反了高效性的原則。
且盡量避免以下劃線-開頭,因為作業系統和庫常使用以乙個或兩個下劃線字元開始的識別符號,進而導致名稱衝突
每個符號應該包含盡可能多的字元,也就是說,我們的編譯器將程式分解成符號的方法是從左向右乙個乙個字元的讀入,如果該字元可以組成乙個符號那麼再讀入下乙個字元,然後在判斷已經讀入的兩個字元是否有可能是乙個符號或者乙個字元的組成部分,如果可能則繼續讀入下乙個字元,然後重複整個過程。如:
int i =10;
int j =20;
int k = i++
+j;
分析得,先使用i的值後給i+1,所以i = 11; j = 20; k = (i++) + j = 10 + 20 = 30;在分析符號時,編譯器會盡可能多的結合有效的符號。
# include
void
oil(
int x)
;int
main()
void
oil(
int x)
cout <<
"post-block texas = "
<< texas;
cout <<
", &texas = "
<<
&texas << endl;
}/*result:
---------------------------------------------
in main(), texas = 31, &texas = 0136f970
in oil(), texas = 5, &texas = 0136f87c
in oil(), x = 31, &x = 0136f890
in block, texas = 113, &texas = 0136f870
post - block texas = 5, &texas = 0136f87c
----------------------------------------------
*/
我們看到,main()和oil()中的texas變數的記憶體位址都不相同
命名空間是一種**組織的策略,通過為變數名前加乙個字首,以便對變數進行區分,防止變數名重複。
using
namespace jack
using
namespace jill
intmain()
即變數只能有一次定義,這體現了無二義性,但這並不意味著不能有多個變數的名稱相同。
鑑於c++語言出現時,計算機的效能普遍較低,成為當時的一大制約因素,於是,為了解決這一問題,高效性便成為c++的次高準則。
但並非所有語言都將高效性作為次高準則,這是因為後續計算機的效能已顯著提高,不再制約程式的執行速度。
若在進行前面表示式時已經明確知道整個表示式的結果,則不會進行後面表示式的運算判斷。
分為&&短路和||短路。
-||短路如: a || b || c…|| n,若a為true,整個表示式都為true,則後續不會進行判斷,若a為false,則對b進行判斷,以此類推。
-&&短路如: a&&b&&c…&&n,若a為false,則整個表示式為false,後續不再進行判斷;若a為true,則判斷b,以此類推。
可以將易判斷的表示式寫在前面有助於節省處理器的運算時間,減少**量,提高效率。
2.2.5.1 引用
可以簡單理解為為變數取個別名,如 int a = 5; int &b = a; 此時,b就是a的別名。
引用的主要用途是用作形參,通過引用變數做引數,函式將使用原始資料,而不是其副本,實質上為變數提供了跨作用域呼叫的機制。
int a =5;
int& b = a;
b++;
cout <<
"b = "
<< b <<
"; a = "
<< a << endl;
cout <<
" b address ="
<<
&b <<
"; a address = "
<<
&a << endl;
# include
void
swap
(int
& a,
int& b)
;int
main()
void
swap
(int
& a,
int& b)
上述結果為:x = 8; y = 5;即交換a和b的值,也同時交換了主調函式中的值。
2.2.5.2 命名空間
見1.2.5命名空間的提出
2.2.5.3 內聯函式
內聯函式是c++為提高程式執行速度所做的一項改進。
我們知道可執行程式實質上是由機器語言指令組成,執行程式時,作業系統將這些指令載入到記憶體中,每一條指令都有對應的記憶體位址,隨後,計算機將會逐步執行這些指令,當遇到函式呼叫語句時會立即儲存呼叫後的記憶體位址,並將引數複製到堆疊,跳到標記函式起點的記憶體單元執行函式**,然後跳回到位址被儲存的指令處。這樣來回的跳躍和記錄位址意味著執行速度的降低。
因此,c++提供了內聯函式。即編譯器將使用相應的函式**替換函式呼叫。
inline
intsquare
(int x)
;inline
intsquare
(int x)
遞增運算子分為字首模式(++i)和字尾模式(i++),讓程式更加簡潔的同時,也使生成的機器語言**效率更高,因為它和實際的機器語言指令更加相似。
程式語言是由程式設計師使用的,目的便是方便程式設計師理解和書寫,所以一套合乎日常習慣的規則會帶來極大的方便,而一套違反日常習慣的規則,不僅會使程式設計師在理解和書寫時造成極大的阻礙,還會使效率大大降低。
有意義的命名一來可以使程式更加容易理解和書寫,二來方便後續程式的更改。
大部分情況下的關鍵字都是有意義的,在英語中有對應單詞的,方便理解的。如:
關鍵字意義
inline
內聯函式
float
浮點型別
static
靜態的return
返回sizeof
求物件byte大小
c++中,如果有兩個不同的物件a和b,a有行為a,b有行為b,如果a和b兩種行為在邏輯上具有相似性,則c++會為物件a額外增加乙個行為b,也會將物件b額外增加乙個行為a。c++是在c的基礎上發展得到的,所以可以從它的身上看到許多c的影子,但是c++在繼承的同時又做了許多改進。
變數有三種初始化方式:
等號初始化: int i = 5;
列表初始化: int i(5);
是變數和陣列之間的「相似相同規則」。
括號初始化: int i;
是變數和物件之間的「相似相同規則」。
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 識別符號不能以數字開頭 ...