三目運算子可以攜帶乙個條件表示式,根據條件表示式的值確定該三目運算子表示式的值。
運算子作用
? :條件表示式?表示式1 : 表示式2,如果條件表示式的值為真則整個三目表示式的值是表示式1的值,否則是表示式2的值
例如:
int a =3;
int b =4;
int c =
(a > b)
?a:b;
// c的值是b
int d =
(a < b)
?a:b;
// d的值是a
一旦前面的條件表示式確定為真或假,直接計算後面對應的乙個表示式,而不會再計算另乙個表示式的值,例如:
int a =3;
int b =4;
int c =
(a > b)
?(a =1)
:(b =2)
;// 結果為b == 2,c == 2, a == 1,因為a = 1的值並未執行
sizeof()並不是乙個函式呼叫,而是乙個運算子。sizeof(x)表示式的值是運算元x所佔的位元組數。
例如:
int a =10;
sizeof
(a);
// 值為4,因為int型別佔4位元組
如果對陣列名使用sizeof()運算子,則表示式的值是整個陣列所有元素所佔的位元組總數:
int arr[12]
;sizeof
(arr)
;// 值為12*4 == 48
前面提到,陣列名本身作為乙個變數(實際上不可修改),但sizeof()運算子作用於陣列名得到的不是它本身的位元組數,這一點要結合指標才能解釋清楚。
逗號運算子可以連線(隔開)多個表示式,而逗號連線的多個表示式整體又被看作乙個表示式,這個表示式的值為最右邊的表示式的值。例如:
int a =1;
int b =2;
int c =3;
int d =4;
int e =
(a, b, c, d)
;// e的值是d的值4
必須將整個逗號運算子連線的表示式用括號括起來,否則將編譯錯誤:
int e = a, b, c, d;
// a,b,c,d重複定義錯誤
另外,逗號運算子中的每個子表示式的值都會被執行計算:
int e =
(a=10
,b=c,c=
30,d=40)
;// 結果為a=10,b=3,c=30,d=40.4=40
可見,逗號運算子連線的多個子表示式的計算順序是從左向右進行的。
像如下的初始化語句中:
int a,b,c =10;
//被認為是單獨的3條初始化語句
這不算做逗號運算子的使用,因為a,b,c均被初始化。
同理下面的**也不是在使用逗號運算子:
int a =1;
int b =2;
int c =3;
a, b, c =10;
// 僅c被賦值為10
//被認為是a;b;c=10;
前面提到過,強制型別轉化可以將乙個表示式的型別強制轉換為其他類型別,例如:
char a =10;
int b =
(int
)a;
雖然上面的**和隱式型別轉換沒什麼區別,但說明實際是可以通過(type)(表示式)的形式強制改變型別的。但要注意的是,強制型別轉換是生成乙個臨時的指定型別變數,而不是改變原表示式本身的型別。上面的**中(int)a的型別是強制轉換來的,但變數a的型別還是char,並沒有變成int。
c/c++中,乙個變數在定義時的型別就確定了、不能改變(字面量在使用時型別也確定了),型別轉換的含義不是改變其型別而是產生乙個指定型別的臨時量來重新存放該值。
+、-運算子既可以是二元的加減,也可以是一元運算子,例如:
int a =-10
;int b =
-a;int c =
+b;float f =
-123.45
;
+不起任何作用。-對於整數來講是將整數的二進位制串取補碼,對於乙個unsgined型別整數使用"-"運算子也不會將其變成signed型別,不過將乙個整數賦值給大寬度的整數變數時,如果對這個整數使用」-「運算子,則會當作signed型別擴充套件符號位而不是,這一點在之前整數相關的部分提到過。
()運算之前就多次使用,通常是用來改變表示式的計算順序(像數學中的括號那樣),再就是可以將多個表示式當作乙個整體(如逗號運算子中必須使用括號指明)。
運算子則只用於陣列的定義和陣列索引獲取陣列元素。
&運算子和*運算子通常結合指標使用,將結合指標再進行解釋。
.運算子和->運算子用於檢索結構體成員,將結合結構體在進行解釋。
如果乙個表示式使用了多個優先順序,則需要確定先計算哪個子表示式再計算哪個子表示式。像數學中的四則運算,運算子都有預設的優先順序,乙個表示式計算時總是先計算優先順序高的運算子連線的子表示式。
c語言中運算子有預設的優先順序,可以參考運算子的優先順序。
在實際應用中,我們不必關心運算子預設的優先順序,因為()運算子的優先順序最高,所以可以對子表示式使用()運算子改變計算的優先順序。
運算子的結合性是指連線兩個運算元(子表示式)的運算子構成大的表示式時,這兩個子表示式應該是同一級別的,先計算左邊子表示式還是先計算右邊子表示式。例如:
int a,b,c,d;
a = b = c = d;
// 賦值運算子結合性為從右到左,所以先計算(b = c = d)再計算a,由於又遇到賦值運算子所以再一次先計算右邊,整體來看也是從右到左依次賦值
之前提到的逗號運算子結合性則是從左向右。其他運算子的結合性可參考:運算子的結合性 運算子優先順序和結合性
所謂優先順序就是當乙個表示式中有多個運算子時,先計算誰,後計算誰。這個其實我們在小學學算術的時候就學過,如1 4 2。但是c語言中的運算子已經遠不止四則運算中的加減乘除了,還有其他很多運算子。當它們出現在同乙個表示式中時先計算誰後計算誰呢?所以本節還是有必要講一下的。最後我還會將所有運算子展示出來,...
運算子優先順序和結合性
優先順序 運算子含義 運算物件個數 結合順序1 初等運算子 自左至右 下標運算子 指向結構體成員運算子 結構體成員運算子2!單目運算子 1 單目運算子 自右至左 負號 指標運算子 sizeof 型別 型別轉換運算子3 乘法算數運算子 2 雙目運算子 自左至右 4 2 雙目運算子 自左至右 5 2 雙...
運算子 優先順序 結合性
語言的運算子可分為以下幾類 1.算術運算子 用於各類數值運算。包括加 減 乘 除 求餘 或稱模運算,自增 自減 共七種。2.關係運算子 用於比較運算。包括大於 小於 等於 大於等於 小於等於 和不等於 六種。3.邏輯運算子 用於邏輯運算。包括與 或 非 三種。4.位操作運算子 參與運算的量,按二進位...