一、什麼是表示式?
表示式就是表達某種意思的式子。
在c語言中,表示式用運算子連線運算元的式子。
廣義上講,有;的就是語句,沒有分號的就是表示式。
二、c語言中的運算子:
(1)算術運算子: 雙目運算子(需要連線兩個運算元),結合性:左->右
* / % + -
★注意整數/整數,其結果還是整數,若想要結果為實數,可在分子*1.0
隱式型別轉換:不同資料型別之間進行運算時,其結果會轉化為精度高的那個資料型別。
(無符號和有符號進行計算,結果為無符號)
%:取餘運算子,在c語言中,要求兩個運算元都必須為整數
5%3 2%3 -5%2 5%-2 -5%-2
(2)關係運算子: 雙目運算子,左->右,表達兩個式子的關係
> >= < <=
== !=
由關係運算子連線運算元組成的表示式,叫做關係表示式
關係表示式的值: 1(關係成立) 0(關係不成立)
5>4>3
==> 1>3
==> 0
(3)邏輯運算子: 表達某數理邏輯的表示式
邏輯表示式的值: 真(非0) 假(0)
★任何非0的數都表示真,但是如果表示式的結果為真時,只能是1
! (邏輯非),單目運算子,取邏輯上的反
!!(-1) ==> 1
&& (邏輯與),雙目運算子,"並且",結合性 左->右
a && b && c
|| (邏輯或),雙目運算子,"或", 結合性 左->右
★在c語言中,運算是"惰性運算"。如果事先知道了表示式的值,那麼它就不會
去運算後面的式子啦。
eg: a && b && c
只有當a的值為真時,才有必要去判斷b的值
只有a和b的值都為真時,才有必要去判斷c的值
a || b || c
只有當a的值為假時,才有必要去判斷b的值
只有當a和b的值都為假時,才有必要去判斷c的值
(4)位運算:按bit位來進行位運算操作的運算子
~ (按位取反):單目運算子
& (按位與): 雙目運算子
1 & 1 ==> 1
1 & 0 ==> 0
0 & 0 ==> 0
0 & 1 ==> 0
| (按位或): 雙目運算子
1 | 1 ==> 1
1 | 0 ==> 1
0 | 1 ==> 1
0 | 0 ==> 0
^ (按位異或): 雙目運算子,相同為假,不同為真
1 ^ 1 ==> 0
1 ^ 0 ==> 1
0 ^ 1 ==> 1
0 ^ 0 ==> 0
<< (左移): 雙目運算子,按bit位往左邊移
eg: int a = 2<<1; //4
把數值2按bit位往左邊移1個bit位,
高位消失,低位補0
>> (右移): 雙目運算子,按bit位往右邊移
邏輯右移: 高位補0
算術右移: 高位補符號位
c語言標準中,沒有規定右移是邏輯右移和算術右移,在不同的編譯器和處理器中,
實現方法可能不一樣。
(5)賦值運算子: 雙目運算子, 右->左,優先順序排倒數第二
= eg: a = 5+3;
賦值表示式的值為賦值符號左邊的值,賦值運算子的左邊(左運算元)必須為"可寫的位址"
5 = 3;//error
復合的賦值運算子:賦值運算子可以和算術運算子、位運算子組成復合的賦值運算子
+= : a += 5 ==> a = a+5
-= &=
*= |=
/= ^=
%= <<=
~= >>=
(6) 條件運算子 ? : 三目運算子 右->左
表示式1 ? 表示式2 : 表示式3
求值順序: 先計算表示式1的值,如果表示式1的值為真,則整個條件表示式的值為表示式2的值,
如果表示式1的值為假,則整個條件表示式的值為表示式3的值
eg: printf("the max is %d\n",a>b?a:b);
注意:條件表示式也有惰性運算
(7) 逗號運算子: 雙目運算子,優先順序最低的, 左->右
表示式1 , 表示式2
求值順序: 先求表示式1的值,再求表示式2的值,整個逗號表示式的值為表示式2的值
逗號表示式的擴充套件
表示式1,表示式2,表示式3,...表示式n
求值順序: 先求表示式1,再求表示式2,...最後求表示式n的值,
整個逗號表示式的值為表示式n的值
注意: 逗號表示式要與引數列表進行區分
(8)☆指標運算子(* , &)
(9)求位元組運算子(sizeof)
求位元組運算子的結果只跟圓括號內是什麼資料型別有關,單位為位元組
sizeof(1.0) == sizeof(double)
sizeof(1.0f) == sizeof(float)
sizeof(2l) == sizeof(long)
sizeof(2u) == sizeof(unsigned int)
short s;
sizeof(s+1) == sizeof(int)
(10)☆分量運算子 (. ->)
用於求結構體變數的成員變數
a.i;
p->i;//p是結構體指標
(11)☆下標運算子 ( )
取陣列中的元素
int a[10];
a[3] a[4]
(12)強制型別轉換運算子
(資料型別)
eg: float a=3.6;
printf("%d\n",(int)a);
(13)自增、自減運算子(++,--): 單目運算子
表示式的值 執行完這個表示式後i的值
i++ i i+1
++i i+1 i+1
i-- i i-1
--i i-1 i-1
注意:(1)要避免 i=i++ 這種用法
(2)要避免在避免在乙個表示式裡對乙個變數重複用++,可能會被編譯器優化
int i=2;
(++i)+(++i)+(++i)
運算子的優先順序和結合性
() -> . 自左向右
! ~ ++ -- +-(正負號) 自右向左 單目運算子
* / % 自左向右 算術運算子
+ -
< <= > >= 自左向右 關係運算子
== !=
& ^ | << >> 自左向右 位運算子
&& 自左向右 邏輯運算子
||? : 自右向左 條件運算子
= += -= *= /=
%= &= |= ^= <<= >>= 自右向左 賦值運算子
, 自左向右 逗號運算子
同級優先順序的運算子,實際優先順序為左側優先
運算子與表示式
學習c語言時,在我們已經學習了型別,常量與變數,接下來就是通過學習運算子與表示式對型別,常量與變數進行運算。簡單說一下概念,用來對資料進行運算的符號,就可以稱為運算子。c中運算子和資料構成的式子,就稱為表示式。表示式再在其後加乙個分號,即構成c 語言語句。先說一下運算子吧。c語言的運算子多,一般記住...
運算子與表示式
數 算 注意事項 兩端的變數必須是同種型別,並返回同種型別。取餘運算,負數的餘數符號與被模數符號相同,1 5 1,1 5 1 num n,n 0,結果範圍 0,n 是週期函式。注意整除問題 1 2 0 整數的除法是整除 1.0 2 0.5 1d 2 0.5 單獨的前 後自增或自減是沒區別的,有了賦值...
運算子與表示式
1.了解什麼是表示式 表示式是由運算子與資料組成的式子,每乙個表示式都有運算的結果。2.我的老師每次使用這個運算子的時候都會說到這個老梗,sizeof是運算子不是函式,別看sizeof後面還要加乙個括號,但不是所有的都是函式。這也從側面sizeof在面試題中經常出現。3.隱式轉換型別 由於有的編譯系...