哈嘍,大家好,今天我們來學(xué)習(xí)C語言中的各中操作符。
目錄
1.操作符的分類
2.算數(shù)操作符
整數(shù)的二進(jìn)制表示
3.位移操作符
3.1左移操作符
3.2右移操作符
4.位操作符
5.賦值操作符
6.單目操作符
6.1 單目操作符介紹
~ 的用法:
6.2 sizeof 和 數(shù)組
7.關(guān)系操作符
8.邏輯操作符
9. 條件操作符
10. 逗號(hào)表達(dá)式
11. 下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
1.操作符的分類
算術(shù)操作符 :? +? -? *? /? %
移位操作符 :? <<? ? >>
位操作符 :? &? |? ^
賦值操作符: =? +=? -=? *=? /=?
單目操作符 :? !? ?sizeof? ?+? ?-? ? ~? &? *
關(guān)系操作符 : >? <? >=? <=? ==? !=
邏輯操作符 :? &&? ||
條件操作符 : ? : :
逗號(hào)表達(dá)式 : ,
下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員 : [ ]? ?()? ?.? ?->
?下面我們將一一學(xué)習(xí)這些操作符
2.算數(shù)操作符
? ?+? ? ? ?-? ? ? ?*? ? ? /? ? ? ?%
這里的 “+”? “ - ”? “ * ” 是我們非常熟悉的,就不再介紹了,但“ / ”?和“ % ”值得我們注意
- 除了 % 操作符之外,其他的幾個(gè)操作符可以作用于整數(shù)和浮點(diǎn)數(shù)。
- 對(duì)于 / 操作符如果兩個(gè)操作數(shù)都為整數(shù),執(zhí)行整數(shù)除法。而只要有浮點(diǎn)數(shù)執(zhí)行的就是浮點(diǎn)數(shù)除法。
- % 操作符的兩個(gè)操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)
整數(shù)的二進(jìn)制表示
整數(shù)的二進(jìn)制表示有三種形式:
原碼
反碼
補(bǔ)碼
1.正整數(shù)原碼,反碼,補(bǔ)碼相同
2.負(fù)數(shù)的原碼,反碼,補(bǔ)碼需要計(jì)算
?不管是正整數(shù)還是負(fù)整數(shù)都可以寫出二進(jìn)制原碼
1.根據(jù)正負(fù)直接寫出的二進(jìn)制序列就是原碼
?對(duì)于正數(shù)15,它的原碼,反碼,補(bǔ)碼相同,而負(fù)數(shù)則可通過下圖的方式進(jìn)行計(jì)算:
?整數(shù)在內(nèi)存中存儲(chǔ)的是補(bǔ)碼,計(jì)算的時(shí)候也是使用補(bǔ)碼計(jì)算的
3.位移操作符
<<??左移操作符
>>??右移操作符
注:移位操作符的操作數(shù)只能是整數(shù)。
?這里左移和右移移動(dòng)的是二進(jìn)制
3.1左移操作符
我們來分析下面的代碼
右移分為兩種:
算數(shù)右移 :右邊的丟棄,左邊補(bǔ)原來的符號(hào)位
邏輯右移 :右邊的丟棄,左邊直接補(bǔ)0
一般編譯器采用的是算數(shù)右移,C語言沒有明確規(guī)定到底是算數(shù)唯一還是邏輯位移。
? 讓我來運(yùn)行上面的代碼:
?此時(shí)a的值還是15,但b得到的是a右移一位的結(jié)果7,而且a的值沒有發(fā)生改變
判斷VS編譯器采用的是邏輯位移還是算數(shù)位移:
使用下面的代碼來判斷:
?因?yàn)?15用兩種位移產(chǎn)生的結(jié)果是不同的:
?上述代碼運(yùn)行結(jié)果:
?因此VS編譯器采用的是算數(shù)位移。
而且我們發(fā)現(xiàn)右移一位對(duì)正數(shù)有 /2 (除2)的效果
3.2右移操作符
左移操作符就是左邊丟棄,右邊補(bǔ)0
?同樣用代碼來學(xué)習(xí):
?
?警告? :
對(duì)于移位運(yùn)算符,不要移動(dòng)負(fù)數(shù)位,這個(gè)是標(biāo)準(zhǔn)未定義的。
4.位操作符
位操作符有:
&? ? 按位與
?|?? ?按位或
^?? ?按位異或
注:他們的操作數(shù)必須是整數(shù)
按位與? &
按位與也是操作二進(jìn)制位,對(duì)應(yīng)兩個(gè)二進(jìn)制的每一位,有0則為0,兩個(gè)同時(shí)為1才是1.
分析下面代碼運(yùn)行的結(jié)果:
?
?程序運(yùn)行結(jié)果:
按位或 |
按位或計(jì)算方法:對(duì)應(yīng)兩個(gè)二進(jìn)制的每一位,有1則為1,兩個(gè)同時(shí)為0才是0
分析下面代碼運(yùn)行的結(jié)果:
??程序運(yùn)行結(jié)果:
按位異或 ^
?按位異或計(jì)算方法:對(duì)應(yīng)兩個(gè)二進(jìn)制的為一位,相同則為0,相異則為1
分析下面代碼結(jié)果:
?程序輸出結(jié)果:
?一道面試題:
?不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換。
?方法一:
?方法二:
?原理:
?兩種方法都能交換a,b,但方法一可能會(huì)溢出,而方法而不會(huì)
5.賦值操作符
賦值操作符是一個(gè)很棒的操作符,他可以讓你得到一個(gè)你之前不滿意的值。也就是你可以給自己重新賦 值。
?復(fù)合賦值符
+=
-=
*=
/=
%=
>>=
<<=?
&=
|=
^=
這些運(yùn)算符都可以寫成復(fù)合的效果
6.單目操作符
6.1 單目操作符介紹
~ 的用法:
~ 對(duì)一個(gè)數(shù)的補(bǔ)碼二進(jìn)制位取反,包括符號(hào)位
擴(kuò)展:將二進(jìn)制某一位由0改成1,1改成0的方法
6.2 sizeof 和 數(shù)組
sizeof是一個(gè)操作符,不是函數(shù),sizeof計(jì)算的是類型創(chuàng)建變量的大小,單位是字節(jié)
sizeof用法:
?sizeof計(jì)算數(shù)組大?。?/p>
?
?分析下面的代碼:
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
問:
(1)、(2)兩個(gè)地方分別輸出多少?
(3)、(4)兩個(gè)地方分別輸出多少?
?再(2),(4)中打印的是指針變量的大小,32位系統(tǒng)下4個(gè)字節(jié),64位系統(tǒng)下8個(gè)字節(jié)
7.關(guān)系操作符
8.邏輯操作符
?閏年的判斷:
int main()
{
int y = 0;
scanf("%d", &y);
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
{
printf("是閏年\n");
}
else
{
printf("不是閏年\n");
}
return 0;
}
?筆試題
程序的輸出結(jié)果是什么?
?&&操作符,左邊為假,右邊就不計(jì)算了
程序的輸出結(jié)果是什么?
?
? ||操作符,左邊為真,右邊就不計(jì)算了
區(qū)分邏輯與和按位與
區(qū)分邏輯或和按位或
9. 條件操作符
exp1 ? exp2 : exp3
條件操作符也稱為三目操作符(有三個(gè)操作數(shù))
?條件操作符可以簡(jiǎn)化代碼:
?用條件操作符求兩數(shù)的較大值:
10. 逗號(hào)表達(dá)式
exp1,? exp2,? exp3, …expN
逗號(hào)表達(dá)式,就是用逗號(hào)隔開的多個(gè)表達(dá)式。
逗號(hào)表達(dá)式,從左向右依次執(zhí)行。整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。
分析:
?答案是13
逗號(hào)表達(dá)式的某些妙用:
11. 下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
1. [ ] 下標(biāo)引用操作符
? ?操作數(shù):一個(gè)數(shù)組名 + 一個(gè)索引值
2. ( ) 函數(shù)調(diào)用操作符
接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
struct Book
{
char name[30];
char author[20];
float price;
};
void Print(struct Book* p)
{
//printf("%s %s %.1f\n", (*p).name, (*p).author, (*p).price);
printf("%s %s %.1f\n", p->name, p->author, p->price);
}
int main()
{
struct Book b1 = { "C語言","李華",30.5f };
struct Book b2 = { "數(shù)據(jù)結(jié)構(gòu)","張三",50.5f };
printf("%s %s %.1f\n", b1.name, b1.author, b1.price);
printf("%s %s %.1f\n", b2.name, b2.author, b2.price);
Print(&b1);
Print(&b2);
return 0;
}
3. 訪問一個(gè)結(jié)構(gòu)的成員
.? ? ? 結(jié)構(gòu)體.成員名
->? ?結(jié)構(gòu)體指針->成員名文章來源:http://www.zghlxwxcb.cn/news/detail-449123.html
struct Book
{
char name[30];
char author[20];
float price;
};
void Print(struct Book* p)
{
//printf("%s %s %.1f\n", (*p).name, (*p).author, (*p).price);
printf("%s %s %.1f\n", p->name, p->author, p->price);
}
int main()
{
struct Book b1 = { "C語言","李華",30.5f };
struct Book b2 = { "數(shù)據(jù)結(jié)構(gòu)","張三",50.5f };
printf("%s %s %.1f\n", b1.name, b1.author, b1.price);
printf("%s %s %.1f\n", b2.name, b2.author, b2.price);
return 0;
}
到這里,C語言的操作符我們就基本學(xué)完了。文章來源地址http://www.zghlxwxcb.cn/news/detail-449123.html
到了這里,關(guān)于C語言——操作符詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!