文章目錄
- 1、表達式組成
- 1、運算符
- 2、表達式的分類
- 1、算數運算符
- 1、自增運算符和自減運算
- 2、取余運算(%)
- 3、除法運算(/)
- 4、案例
- 2、關系運算符
- 3、邏輯運算符
- 4、條件運算符(三目運算符)
- 1、案例
- 5、賦值運算(=)
- 1、賦值類型轉換
- 2、復合賦值運算
- 6、逗號運算
- 7、取地址運算(&)
- 8、計算變量占用幾個字節(sizeof)
- 9、位運算(二進制運算)
- 1、按位取反
- 2、按位與運算(&)
- 3、按位或運算(|)
- 4、按位異或運算(^)
- 5、左移位運算(<<)
- 6、右移位運算(>>)
- 3、運算的優先級與結合性
1、表達式組成
1、運算符
-
根據運算符的操作個數分為單目,雙目,三目
-
a++ 單目運算
-
a+b 雙目運算
-
?表1;表2 三目運算
2、表達式的分類
1、算數運算符
1、自增運算符和自減運算
-
a++ ++a,自增1
-
++i 先增加1,然后再使用
-
i++ 先使用i的值,然后增加+1,先用,后使用
-
跟的是一個變量,不能是表達式,常量
-
–i,++i都用完之后才能加,也就是語句
#include<stdio.h>
void main()
{int a = 1 ,b=2,c;c = ++a*b;printf("%d,%d",c,a);
}# tc版本
# 掃描整個表達式 ,i=1
(++i)+(++i)+(++i)# 所以i=4 ,結果為3*4 = 12# vc版本# 只能先算后面2個表達式# i = 3 3+3+(++i) = 6+4=10# 編譯器的不同
#include<stdio.h>
void main()
{int i,j;i=j=5;printf("i++=%d,j--=%d\n",i++,j--);printf("++i=%d,++j=%d\n",++i,--j);printf("i++=%d,j--=%d\n",i++,j--);printf("++i=%d,++j=%d\n",++i,--j);printf("i=%d,j=%d\n",i,j);
}
2、取余運算(%)
-
%要求參與運算的2個量必須是整型,不能有實型(小數),實型數據不能做%運算
-
可以判斷是不是偶數
-
正負號取決于被除數
-
5%(-2) = 1 ,(-5)%2 = -1
-
0取余任何數據結果都為0
int a = 10,b;
b = a%3; # %的優先級高于= ,先算右邊的,= 的結合性自右向左的,賦值給b
printf("%d",b);
3、除法運算(/)
-
如果有小數參與,得到的就是小數
-
如果均為整數參與運算,得到的就是整數
4、案例
3.5+1/2+56%10345取出個位,十位,百分位
2、關系運算符
-
也就是條件運算
-
關系運算符,低于算數運算符,高于邏輯運算
-
1代表的真,0代表的為假
5 > 3 的結果為真,值為13<7<5# 先算從往右算,1<5成立,為真,1
3、邏輯運算符
-
非0代表真,0代表假
-
&& 邏輯與,2邊都為真,就為真
-
|| 邏輯或,有一個為真,則為真
-
!邏輯非 為真結果就為假,運算的優先級高于上面的&&,|| ,因為是單目運算符
-
!>&&>|| 低于關系運算符,高于賦值運算符
-
&& 只要表達式的值能夠確定,就不在計算下去了
-
|| 可以確定整個表達式的值為假時,剩下的表達式部分邊不在計算
#include<stdio.h>
void main()
{int a=3,b=5,c=7,d;d = a >5&&b--||c++;printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);}# 3581
# 如果能確定值的話,剩下的表達式就不用算了
- 邏輯表達式描述條件
# x是3的倍數x%3==0# x是偶數x%2==0# x是3的倍數并且是偶數(x%3==0)&&(x%2==0)# 三位數x是回文數,121,首尾相等x/100 == x%10# abc為三邊,構成等邊三角形(a==b)&&(b==c)# 某年是閏年
# 能夠被4整除,并且不能被100整除或者可以被400整除((year%4==0)&&(year%100!=0))||(year%400==0)#include<stdio.h>
void main()
{int x,y,z,t;x=y=z=1;t = ++x||++y&&++z;printf("x=%d,y=%d,z=%d,t=%d",x,y,z,t);
}# 先算++x 為真 ,||后面的就不用算了,短路的特性# 因為·單目運算符的優先級高于|| ,所以的話,先算出++x > 0 ,因此后面就不用算了
4、條件運算符(三目運算符)
-
?和;組成
-
三目運算符
-
表達式1?表達式2:表達式3
-
表達式1為真執行表達式2,否則執行表達式3
-
表達式1必須是判斷的,有一個真假的值
-
條件運算,優先級高于賦值運算和逗號運算
-
從右往左算
a>b?a:c>d?c:d# 先算右邊的再算左邊的
a>b?a:(c>d?c:d)
1、案例
- 比較2個數的誰打誰小
a?a:b# 如果a>b輸出a# 如果a<b輸出b 這個就是求出了最大值
- 求a的絕對值
a>0?a:-a# 如果a>0,就輸出a# 如果a<=0,就輸出-a,也就是絕對值
- 輸入一個字母,以小寫的形式輸出
# 'A'和'Z'之間的范圍,就是大寫字母
#include<stdio.h>
void main()
{char ch;scanf("%c",&ch);ch = (65<=ch<97)?ch+32:ch;printf("%c",ch);
}
5、賦值運算(=)
-
右結合性,算右邊的
-
= 左邊的操作數只能是變量
1、賦值類型轉換
-
實型數據賦給整型,舍棄小數部分,不是四舍五入
-
將整型數據賦給單雙精度時,數值大小不變,以浮點形式存儲
-
字符型數據賦值給整型變量時,由于字符只占一個字節,整形占2個字節,因此字符型數據放在整型變量的低8位中,這樣數據就不會發生改變了,高八位補0即可
-
基本整形數據賦給長整型變量時,基本整形數據放在長整型變量低16位中,反之長整型賦給基本整形變量時,只將長整型數據的低16位送給基本整形變量,正數用0補全,負數用1來補全
2、復合賦值運算
-
+=,-=,*=,/= %=
-
變量? = 表達式 = 等價于 變量=變量?表達式
#include<stdio.h>
void main()
{int a = 3;a+=a*=a+1;printf("%d",a);
}# 右結合性
6、逗號運算
-
優先級是最低的
-
從左往右算
-
表達式1,表達式2,表達式3,表達式n 表達式n就是最終的結果
-
自增和自減遇到逗號立刻完成
-
賦值運算高于逗號運算
x=a=3,6*x,6*a,a+x# 最后的結果為6,a與x的結果沒有變x=3,x++,x+2;# x++,這個時候x=4,表達式最后的結果為6
# x的值為4
7、取地址運算(&)
- 變量存儲在內存中,這個&就能求出這個地址
8、計算變量占用幾個字節(sizeof)
#include<stdio.h>
void main()
{printf("%d\n",sizeof(char)); # 占一個字節printf("%d\n",sizeof("qwer")); # 輸出5個字節,\0
}
9、位運算(二進制運算)
1、按位取反
-
運算符 ~
-
右結合性
-
將一個二進制按位取反,0變1,1變0
~25
0000000000011001 # 25的二進制1111111111100110 # ~25 先按位取反1000000000011001 # 取反碼1000000000011010 # ~25的補碼 按位取反后為-26
2、按位與運算(&)
-
都是1就是1,有0就是假
-
1&任何數 都是那個數
0x29&0x37
00101001
0011011100100001 # 得到的結果為0x21
3、按位或運算(|)
- 有一個1就是真
4、按位異或運算(^)
- 相同為0,不同為1
5、左移位運算(<<)
-
對左邊的操作進行移位,右邊操作數是移動的位數
-
左移的話相當于乘以2^n
-
空出的為補0
15<<2
1111
111100 # 移動之后的為60
6、右移位運算(>>)
- 除以2^n取整
15>>2
1111
11.11 # 后面的11被舍棄了為3
3、運算的優先級與結合性
-
* 是指針運算符,就是單目的
-
如果是乘號,就是雙目運算符
-
單目運算符和賦值運算符,從右到左
-
大多數都是從左往右進行計算
-
從左往右看2個運算符,比較幾個運算符的優先級
-
當前面的高于后面的,直接算前面一個
-
當后面高于前面的,繼續向后比較
-
真就是1,假就是0,看的是結果