c語言中支援++字首運算子和++字尾運算子,但是字首運算子的優先順序高於字尾的優先順序,c語言的運算子優先順序共有15等級,在同一等級的運算子中的運算順序是由結合性決定的。
優先順序運算子
名稱或含義
使用形式
結合方向說明1
陣列下標
陣列名[常量表示式]
左到右()
圓括號(表示式)/函式名(形參表)
.成員選擇(物件)
物件.成員名
->
成員選擇(指標)
物件指標->成員名2-
負號運算子
-表示式
右到左單目運算子
(型別)
強制型別轉換
(資料型別)表示式
++自增運算子
++變數名/變數名++
單目運算子
--自減運算子
--變數名/變數名--
單目運算子
*取值運算子
*指標變數
單目運算子
&取位址運算子
&變數名
單目運算子
!邏輯非運算子
!表示式
單目運算子
~按位取反運算子
~表示式
單目運算子
sizeof
長度運算子
sizeof(表示式)3/
除表示式/表示式
左到右雙目運算子*乘
表示式*表示式
雙目運算子
%餘數(取模)
整型表示式/整型表示式
雙目運算子4+
加表示式+表示式
左到右雙目運算子-減
表示式-表示式
雙目運算子
5<<
左移變數《表示式
左到右雙目運算子
>>
右移變數》表示式
雙目運算子
6>
大於表示式》表示式
左到右雙目運算子
>=
大於等於
表示式》=表示式
雙目運算子
<
小於表示式《表示式
雙目運算子
<=
小於等於
表示式<=表示式
雙目運算子7==
等於表示式==表示式
左到右雙目運算子
!=不等於
表示式!= 表示式
雙目運算子8&
按位與表示式&表示式
左到右雙目運算子9^
按位異或
表示式^表示式
左到右雙目運算子10|
按位或表示式|表示式
左到右雙目運算子
11&&
邏輯與表示式&&表示式
左到右雙目運算子
12||
邏輯或表示式||表示式
左到右雙目運算子
13?:
條件運算子
表示式1? 表示式2: 表示式3
右到左三目運算子14=
賦值運算子
變數=表示式
右到左/=
除后賦值
變數/=表示式
*=乘後賦值
變數*=表示式
%=取模後賦值
變數%=表示式
+=加後賦值
變數+=表示式
-=減後賦值
變數-=表示式
<<=
左移後賦值
變數<<=表示式
>>=
右移後賦值
變數》=表示式
&=按位與後賦值
變數&=表示式
^=按位異或後賦值
變數^=表示式
|=按位或後賦值
變數|=表示式15,
逗號運算子
表示式,表示式,…
左到右從左向右順序運算
在此,需要說明乙個問題:
問題1:
對於語句:
int a=4;
++(a++);
存在的問題。
根據編譯原理的知識可以知道,翻譯此語句是
const t1=a;
a=t1+1;
t2=t1+1;
t1=t2;
顯然t1已經宣告為const常量,所以再將t1賦值顯然是錯誤的,因為t1的值不能被改變。
問題2:
int a=3, b;
b=(++a)+(++a);
printf("%d",b);
列印出來的結果是10
這個問題的正確理解:
採用編譯原理的三元組翻譯此段:
t1=a;
a=t1+1;
t2=a+1;
a=t2;
t3=a+a;
b=t3;
因此可以知道輸出結果是10
問題3:
int a=3;
printf("%d %d",a++,a++);
這個輸入的結果是
4 3這個問題的理解涉及到電腦程式空間組織的理解了,
在引數傳遞的問題中,計算機總是先將後面的引數先傳入資料棧中,後傳遞前面的引數,因此輸出的結果就會是4 3了。。。
三目運算子的思考
在一些索引鍵的獲取中,通常需要使用三目運算子來獲取是否存在的索引鍵。例如 name isset data name data name 當需要獲取很多這樣的屬性或者該變數的變數名比較長的時候 就會帶來三目運算子的書寫的複雜性。這裡封裝乙個函式來獲取索引鍵 如下 從某個物件或者陣列中安全的獲取某個鍵元...
(運算子) 運算子
運算子既可作為一元運算子也可作為二元運算子。備註 unsafe context data guid 00bf87717d88a9fac1afadb796c675da 一元 運算子返回運算元的位址 要求 unsafe 上下文 bool data guid 9efd189df2cfb88799dca08...
c 對提取運算子與插入運算子的過載
c 的流插入運算子 和流提取運算子 是c 在類庫中提供的,所有c 編譯系統都在類庫中提供輸入流類istream和輸出流類ostream。cin和cout分別是istream類和ostream類的物件。在類庫提供的標頭檔案中已經對 和 進行了過載,使之作為流插入運算子和流提取運算子,能用來輸出和輸入c...