勤時當勉勵 歲月不待人
C/C++ 游戲開發(fā)
Hello,這里是君兮_,最近要準備期末復(fù)習(xí)了,可能更新的就不會那么頻繁了,下個星期恢復(fù)正常更新。
前言
今天給大家?guī)淼氖遣僮鞣斀?,由于這部分的內(nèi)容比較多,可能會分成幾部分講,今天帶來的是第一部分的內(nèi)容,廢話不多說,咱們開始吧!
一.操作符的分類
- 操作符大致分為以下幾種
- 算術(shù)操作符
- 移位操作符
- 位操作符
- 賦值操作符
- 單目操作符
- 關(guān)系操作符
- 邏輯操作符
- 條件操作符
- 逗號表達式
- 下標引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
- 咱們還是先畫個圖來說明,具體的再一個一個介紹用法及使用場景
二.算數(shù)操作符
+ - * / %
-
- 除了 % 操作符之外,其他的幾個操作符可以作用于整數(shù)和浮點數(shù)。
-
- 對于 / 操作符如果兩個操作數(shù)都為整數(shù),執(zhí)行整數(shù)除法。而只要有浮點數(shù)執(zhí)行的就是浮點數(shù)除法。
-
- % 操作符的兩個操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)。
- 我們來通過一段代碼理解一下:
#include<stdio.h>
int main()
{
int r = 7 / 2;
printf("%d\n", r);
double d = 7 / 2;
printf("%lf\n", d);//3.5?
double d1 = 7.0 / 2.0;
printf("%lf\n", d1);//3.5?
return 0;
}
- 運行結(jié)果
- 大家可能對打印的第一個數(shù)字和第三個數(shù)字都沒什么疑問,唯一有問題的就是為什么第二個后面的小數(shù)部分被省去了,接下來我來講講原因
- 我們可以看到7和2都是整數(shù),那么執(zhí)行的就是整數(shù)除法,在整形中是不存在小數(shù)的,因此小數(shù)點后面的部分會被直接舍去,此時我們又把7/2得到的3賦給一個浮點型的d,打印出來是要保留小數(shù)后面的幾位的,因此打印出來的才是屏幕上的結(jié)果
- 總結(jié):
- 當你想要進行浮點數(shù)除法時,除號兩邊的數(shù)得至少有一個浮點型!?。?/strong>
三.移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作數(shù)只能是整數(shù)。
-
在講這方面內(nèi)容之前,先給大家簡單的補充一些數(shù)據(jù)在內(nèi)存中存儲的知識,方便大家下面更好的理解,如果你想更具體的了解這方面的知識,不妨去看看我的這兩篇博客,以下是鏈接:
【C語言進階】納尼?這樣學(xué)數(shù)據(jù)在內(nèi)存中的存儲竟然如此簡單(1)?
【C語言進階】納尼?這樣學(xué)數(shù)據(jù)在內(nèi)存中的存儲竟然如此簡單(2)?
整型在內(nèi)存中是以二進制的形式存儲的,而內(nèi)存中存儲的是補碼,并且是倒著存的。
現(xiàn)在我來具體解釋一下上面這段話。
1.二進制表示的三種形式
二進制在內(nèi)存中表示形式分別是原碼,反碼,補碼。
- 其中,數(shù)據(jù)在內(nèi)存中是以二進制補碼的形式進行存儲的
- 以下面的代碼說明
int main()
{
int num = 10;//創(chuàng)建一個整型變量,叫num,這時num向內(nèi)存申請4個字節(jié)來存放數(shù)據(jù)
//4個字節(jié)-32比特位
//00000000000000000000000000001010-原碼
//00000000000000000000000000001010-反碼
//00000000000000000000000000001010-補碼
int num2 = -10;//
//10000000000000000000000000001010 - 原碼
//11111111111111111111111111110101 - 反碼
//11111111111111111111111111110110 - 補碼
return 0;
}
- 十進制數(shù)據(jù)的二進制表現(xiàn)形式就是原碼,原碼最左邊的一個數(shù)字就是符號位,0為正,1為負。
- 對于正數(shù)而言,原碼反碼補碼三者相同,對于負數(shù)而言,反碼為原碼符號位不變,其他位取反(1變?yōu)?,0變?yōu)?)
- 對于負數(shù)而言,補碼為反碼+1。
2.左移操作符 <<
- 移位規(guī)則
左邊拋棄,右邊補零
- 注意,以下我們所說的移位,移動的都是補碼的二進制序列
int main()
{
int num = 10;//創(chuàng)建一個整型變量,叫num,這時num向內(nèi)存申請4個字節(jié)來存放數(shù)據(jù)
//4個字節(jié)-32比特位
//00000000000000000000000000001010-原碼
//00000000000000000000000000001010-反碼
//00000000000000000000000000001010-補碼
int b=num << 1;
//00000000000000000000000000010100-補碼
printf("%d\n", num);
printf("%d\n", b);
return 0;
}
- 注意,移位操作并不會改變原來變量的大?。。?/font>
3.右移操作符 >>
- 移位規(guī)則:
- 首先右移運算分兩種:
-
1. 邏輯移位
左邊用0填充,右邊丟棄
-
2. 算術(shù)移位
左邊用原該值的符號位填充,右邊丟棄
int main()
{
int num = 10;
//邏輯右移 左邊用0填充,右邊丟棄
//00000000000000000000000000001010-補碼
int b=num >> 1;
//00000000000000000000000000000101-補碼
printf("%d\n", num);
printf("%d\n", b);
//算數(shù)右移 左邊用原該值的符號位填充,右邊丟棄
int num1 = -1;
//10000000000000000000000000000001-原碼
//11111111111111111111111111111110-反碼
//11111111111111111111111111111111-補碼
int c = num1 >> 1;
printf("%d", c);
return 0;
}
-
C語言沒有明確規(guī)定是邏輯右移還是算術(shù)右移,但是一般編輯器采用的都是算術(shù)右移
如圖可見,我們當前編譯器采用的是邏輯右移,否則符號位應(yīng)該變?yōu)?打印出來的應(yīng)該是一個正數(shù)。
4.錯誤的寫法
- 另外,要注意這種寫法:
int main()
{
int a = 5;
int b = a >> -2;//標準未定義行為
return 0;
}
- 有些人可能腦子一抽,突然想到,我右移一個負數(shù)不就是左移嗎?
- 注意:對于移位運算符,不要移動負數(shù)位,這個是標準未定義行為??!
四.位操作符
- 位操作符有:
& //按位與
| //按位或
^ //按位異或
- 注:他們的操作數(shù)必須是整數(shù)。
- 以下位操作符對應(yīng)操作的仍然是二進制補碼
1.& 按位與
& 按位與 ---- 對應(yīng)二進制位有0則為0,兩個同時為1,才是1
int main()
//{
// int a = 3;
// //00000000000000000000000000000011 - 補碼
// int b = -5;
// //10000000000000000000000000000101
// //11111111111111111111111111111010
// //11111111111111111111111111111011 - 補碼
// //
// int c = a & b;
// //& -- 對應(yīng)二進制位有0則為0,兩個同時為1,才是1
// //00000000000000000000000000000011
// //11111111111111111111111111111011
// //00000000000000000000000000000011 - 補碼
// //
// printf("%d\n", c);//3
//
// return 0;
//}
2.| 按位或
| 按位或 ---- 對應(yīng)的二進制位有1則為1,兩個同時為0才是0
int main()
{
int a = 3;
//00000000000000000000000000000011 - 補碼
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011 - 補碼
//
int c = a | b;
//| - 按(2進制)位或 - 對應(yīng)的二進制位有1則為1,兩個同時為0才是0
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111011 - 補碼
//11111111111111111111111111111010
//10000000000000000000000000000101 - -5
printf("%d\n", c);//3
return 0;
}
3.^ 按位異或
^ 按位異或 ----對應(yīng)的二進制位相同為0,相異為1
int main()
{
int a = 3;
//00000000000000000000000000000011 - 補碼
int b = -5;
//10000000000000000000000000000101
//11111111111111111111111111111010
//11111111111111111111111111111011 - 補碼
//
int c = a ^ b;
//^ - 按二進制位異或 -對應(yīng)的二進制位相同為0,相異為1
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111000 - 補碼
//11111111111111111111111111110111
//10000000000000000000000000001000 - -8
printf("%d\n", c);//3
return 0;
}
4.位操作符應(yīng)用實例
- 看了上面的內(nèi)容,可能有些人會有疑問,這些位操作符具體都有啥用呢?
- 以下我們來通過幾個例子說明:
- 1.我們先來看一個簡單的例子:
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
- 上面的這段代碼a,b,c的結(jié)果是多少?
- 很簡單吧?遇到這種問題一定不要偷懶,畫圖是最好的解決方法!
- 2.在不創(chuàng)建臨時變量(第三個變量)的情況下,實現(xiàn)兩個數(shù)的交換。
- 這其實是某公司的一個面試題,如果你能理解上面所講的內(nèi)容并學(xué)會應(yīng)用,其實并不復(fù)雜。
- 實現(xiàn)代碼如下:
//在不創(chuàng)建臨時變量(第三個變量)的情況下,實現(xiàn)兩個數(shù)的交換。
int main()
{
int a = 10;
00000000000000000000000000001010--10的補碼
int b = 20;
00000000000000000000000000010100--20的補碼
a = a ^b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d", a, b);
return 0;
}
- 成功實現(xiàn)我們的目標,可是為什么呢?
- 下面我來解釋一下,如果你是基礎(chǔ)不是特別好的初學(xué)者的話,這里還是建議自己先畫圖感受一下哦!
a = a ^b;
//00000000000000000000000000001010--a
//00000000000000000000000000010100--b
//00000000000000000000000000011110--a=a^b
- 此時a已經(jīng)變成了a ^b
b = a ^ b;
//00000000000000000000000000010100--b
//00000000000000000000000000011110--a=a^b
//00000000000000000000000000001010-b=a^b
- 此時的b已經(jīng)與a完成交換變成10了
a = a ^ b;
//00000000000000000000000000011110--a=a^b
//00000000000000000000000000001010-b=a^b
//00000000000000000000000000010100 a=a^b a=20
- 最后一次異或,把b的值交換給a
- 逐步分析這段代碼是不是就清晰多了?
總結(jié)
- 今天的內(nèi)容暫時到這里就結(jié)束了,我們今天講了有關(guān)算數(shù)操作符,移位操作符和位操作符的應(yīng)用,如果你還有所困惑不妨自己動手實操一下,這方面的知識是稍微有點抽象,需要咱們反復(fù)的練習(xí)熟悉起來才行。
- 以上就是關(guān)于操作符的第一部分內(nèi)容,后面其他的操作符應(yīng)用詳解會在近期分批次更新,敬請期待??!
- 好了,如果你有任何疑問歡迎在評論區(qū)或者私信我提出,大家下次再見啦!
新人博主創(chuàng)作不易,如果感覺文章內(nèi)容對你有所幫助的話不妨三連一下這個新人博主再走唄。你們的支持就是我更新的動力?。?!
**(可莉請求你們?nèi)B支持一下博主!?。↑c擊下方評論點贊收藏幫幫可莉吧)** 文章來源:http://www.zghlxwxcb.cn/news/detail-515874.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-515874.html
到了這里,關(guān)于【C語言初階】帶你輕松玩轉(zhuǎn)所有常用操作符(1) ——算數(shù)操作符,移位操作符,位操作符的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!