一、算術(shù)操作符

+、-、*、/、%
(1)希望? /? 結(jié)果是浮點(diǎn)數(shù),?分子或分母必須有一個(gè)是浮點(diǎn)數(shù)。
(2)%? 不能用于浮點(diǎn)數(shù)。
二、移位操作符
< ?左移操作符
>> ?右移操作符
1.整數(shù)的二進(jìn)制表示3種:
(1)原碼
(2)反碼
(3)補(bǔ)碼
注:
a、正整數(shù)的原、反、補(bǔ)碼相同;
b、負(fù)整數(shù)的原、反、補(bǔ)碼需要計(jì)算。
c、對于有符號(hào)(signed)數(shù)來說,二進(jìn)制數(shù)的第一位是符號(hào)位。0代表正數(shù),1代表負(fù)數(shù);
d、整數(shù)在內(nèi)存中以補(bǔ)碼的形式存在。
e、但是打印出來的值是以原碼的形式打印的;
f、反碼求原碼兩種方法:先取反
g、?右移共有兩種,一種是算術(shù)右移,一種是邏輯右移;
?算術(shù)右移:右邊丟棄,左邊補(bǔ)原符號(hào)位;
?邏輯右移:右邊丟棄,左邊補(bǔ)0;
?而右移是哪種右移,取決于編譯器。
h、移動(dòng)的位數(shù)不能是負(fù)數(shù):如,a>>-1是錯(cuò)的。
例:int? a = 5;(32位操作系統(tǒng))
原碼:00000000000000000000000000000101
反碼:00000000000000000000000000000101
補(bǔ)碼:00000000000000000000000000000101
int b = -5;
原碼:10000000000000000000000000000101
反碼:111111111111111111111111111111111010(符號(hào)位不變,其他位取反)
補(bǔ)碼:111111111111111111111111111111111011(反碼+1)
2.移位
左移:
a<<1;移動(dòng)a的補(bǔ)碼;
左移前:00000000000000000000000000000101
左移后:00000000000000000000000000001010(左邊丟棄,右邊補(bǔ)0)
b<<1;移動(dòng)b的補(bǔ)碼
左移前:111111111111111111111111111111111011
左移后:111111111111111111111111111111110110
? 反碼:111111111111111111111111111111110101
? 原碼:10000000000000000000000000001010
右移:(算術(shù)右移)
a>>1;
右移前:00000000000000000000000000000101
右移后:00000000000000000000000000000010
?????
b>>1;
右移前:111111111111111111111111111111111011
右移后:111111111111111111111111111111111101
三、位操作符
&? ? ? ? ? //按位與
|? ? ? ? ? ?//按位或
^? ? ? ? ? ? //按位異或
操作數(shù)必須是整數(shù)。
&: 每個(gè)數(shù)的二進(jìn)制補(bǔ)碼進(jìn)行運(yùn)算,只要有一個(gè)數(shù)為0則為0,兩個(gè)數(shù)都為1,才是1.
|:? 只要有一個(gè)數(shù)為1,則為1,兩個(gè)數(shù)都是0 才是0;
^: 相同為0,相異為1,0與任何數(shù)異或都是那個(gè)數(shù)本身,兩個(gè)相同的數(shù)異或?yàn)?。
例 1:
不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換
方法一:(此方法問題,當(dāng)a+b的和過大,超過int的范圍時(shí),則會(huì)導(dǎo)致數(shù)據(jù)的丟失)
#includeint main()
{
int a=3;
int b=5;
printf("a=%d b=%d",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("a=%d b=%d",a,b);
return 0;
} 方法二、
#includeint main()
{
int a=3;
int b=5;
printf("a=%d b=%d",a,b);
a=a^b;//(1)
b=a^b;//(2)
a=a^b;//(3)
printf("a=%d b=%d",a,b);
return 0;
} 解釋:
由異或的性質(zhì),兩個(gè)相同的數(shù)異或結(jié)果為0;
那么a=a^b;
第二個(gè)式子b=a^b; 可以看做 b=a^b^b,(兩個(gè)相同的數(shù)異或結(jié)果為0),得b=2;
第三個(gè)式子a=a^b;聯(lián)立式1和式二;可得a=a^b^a,解得a=b;
例 2:
求一個(gè)整數(shù)在內(nèi)存中存儲(chǔ)的二進(jìn)制形式有幾個(gè)1。
方法一、
#includeint main()
{
int n=0;
scanf("%d",&n);
int i=0;
int count=0;
for(i=0;i<32;i++)
{
if((n>>i)&1==1)
{
count++;
}
}
printf("%d\n",count);
return 0;
} 四、賦值操作符
=、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
五、單目操作符
! ? ? ? ? ? 邏輯反操作? ->真變假,假變真->0為假,非0真。 - ? ? ? ? ? 負(fù)值 + ? ? ? ? ? 正值 & ? ? ? ? ? 取地址 sizeof ? ? ? 操作數(shù)的類型長度(以字節(jié)為單位) ~ ? ? ? ? ? 對一個(gè)數(shù)的二進(jìn)制按位取反 -- ? ? ? ? ? 前置、后置 -- ++ ? ? ? ? ? 前置、后置 ++ * ? ? ? ? ? 間接訪問操作符 ( 解引用操作符 ) ( 類型 ) ? ? ? 強(qiáng)制類型轉(zhuǎn)換
sizeof:? ?a、是操作符不是函數(shù);b、如果求變量的大小,可省去(),是類型不可省去;c、sizeof(s=a+3);括號(hào)中的表達(dá)式不參與運(yùn)算,出來后s的值不變;
例: ~? 的應(yīng)用
int a=11;
//此時(shí)二進(jìn)制為
//00000000000000000000000000001011
//想要將第三位的0變成1;
//將第三位或一個(gè)1即可
//00000000000000000000000000000100
a |= 4;
//而4是1向左移動(dòng)兩位得來的,即
a |= (1<<2);
//此時(shí)又想將或之后的數(shù)變回去,此時(shí)的二進(jìn)制數(shù)是
//00000000000000000000000000001111
//要想將第三位變回0,需要與一個(gè)0,即
//11111111111111111111111111111011
//上邊的數(shù)又是通過4取反得來的,即
//00000000000000000000000000000100取反,代碼為:
a |= (~(1<<2));注:
a、C語言在C99之前無表示真假的類型,C99中引用了布爾類型
六、關(guān)系操作符
if("abcdefg"=="ahbhgh")此時(shí) == 比較的是兩個(gè)數(shù)組首字母的地址。
七、邏輯操作符
&&、||
#includeint main()
{
? ?int i = 0,a=0,b=2,c =3,d=4;
? ?i = a++ && ++b && d++;
? ?//i = a++||++b||d++;
? ?printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
? ?return 0;
} 該代碼的輸出結(jié)果是1 2 3 4;
因?yàn)閍++是先使用后++,但最初a=0,而&&運(yùn)算符當(dāng)有一個(gè)是0 時(shí),就不繼續(xù)運(yùn)算了。
如果改為 || 的話,如果有一個(gè)為真,后邊的就不繼續(xù)計(jì)算了。
八、下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
下標(biāo)引用
arr[4]? ? ? 等價(jià)于? ? ?*(arr+4)? ? ? ? ? ? 等價(jià)于? ? ? 4[arr]
九、表達(dá)式求值(重要!)
? ? ? ?表達(dá)式求值的順序一部分是由操作符的優(yōu)先級(jí)和結(jié)合性決定; ? ? ? ?有些表達(dá)式的操作數(shù)在求值的過程中可能需要轉(zhuǎn)換為其他類型。1.隱式類型轉(zhuǎn)換
整形提升:表達(dá)式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型。
整形提升的方法:
int main()
{
char c1=3;
? //3是一個(gè)整型數(shù)字,二進(jìn)制序列為:
? //00000000000000000000000000000011
? //但存儲(chǔ)到char類型的變量中會(huì)發(fā)生截?cái)啵?/p>
? //00000011(在c1中的存儲(chǔ))
? char c2=127;
? //127二進(jìn)制序列為:
? //000000000000000000000000001111111
//截?cái)?/p>
? //01111111
??
? char c3 = c1 + c2;
? //在計(jì)算時(shí),需要再次將c1與c2進(jìn)行整型提升,提升為int類型,即
? //c1:? ? ? ?00000000000000000000000000000011
? //c2:? ? ? ?000000000000000000000000001111111
? //相加得:00000000000000000000000001000010
? //再次存入到char類型的c3中為
? //1000010(此時(shí)最高位1 是符號(hào)位)
? printf("%d\n",c3);
? //printf()打印是看的是原碼;
? //c3進(jìn)行整形提升,即:(對于有符號(hào)數(shù),提升時(shí)補(bǔ)符號(hào)位)
? //1111111111111111111111111000010
? //轉(zhuǎn)成原碼:
? //1000000000000000000001111101
? //結(jié)果為:126
}
2.算數(shù)轉(zhuǎn)換
如果某個(gè)操作符的各個(gè)操作數(shù)屬于不同的類型,那么除非其中一個(gè)操作數(shù)的轉(zhuǎn)換為另一個(gè)操作數(shù)的類型,否則操作就無法進(jìn)行。下面的層次體系稱為尋常算術(shù)轉(zhuǎn)換。3.操作符的屬性?
(1)優(yōu)先級(jí)
(2)結(jié)合性
(3)是否控制求值順序
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:【C語言初階】五、操作符詳解-創(chuàng)新互聯(lián)
URL鏈接:http://chinadenli.net/article42/eddhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、App設(shè)計(jì)、網(wǎng)站制作、搜索引擎優(yōu)化、靜態(tài)網(wǎng)站、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容