最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言各種符號的使用介紹下篇

 更新時間:2022年08月10日 08:56:06   作者:程序猿教你打籃球  
C?語言的基本符號就有?20?多個,每個符號可能同時具有多重含義,而且這些符號之間相互組合又使得?C?語言中的符號變得更加復(fù)雜起來

1、按位運算符

1.1 按位或( | )和按位與( & )

上期我們講到過邏輯或和邏輯與,他們得到的結(jié)果是真假值,但我們一定要區(qū)分清楚,按位運算符 "|" 和 "&" 與邏輯運算符 "||" "&&" 是完全兩個概念。

按位,簡明之意,按數(shù)值二進(jìn)制位來進(jìn)行運算,都是在數(shù)據(jù)補(bǔ)碼的基礎(chǔ)上進(jìn)行。

按位或 "|" :兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運算,對應(yīng)位有 1 則為 1 ,否則為 0。

按位與 "&":兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運算,對應(yīng)位都為 1 則為 1, 否則為 0。

這里我們舉例說明:

1 | 2 :

1 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0001

2 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0010

------按位或結(jié)果: 0000 0000... 0000 0011 -> 對應(yīng)十進(jìn)制:3

1 & 2:

1 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0001

2 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0010

------按位與結(jié)果: 0000 0000... 0000 0000 -> 對應(yīng)十進(jìn)制:0

其實有很多大學(xué)老師或者是書上都有可能把按位或,按位與,以及后面我們要講的按位異或,他們會把每位二進(jìn)制運算后的結(jié)果稱為真或者假,其實這樣的說法是不夠嚴(yán)謹(jǐn)?shù)模婕偈沁壿嬇袛?,而按位運算得到的結(jié)果是數(shù)值,而且在C語言中0表示假,非0為真,所以我是不推薦這種說法。

1.2 按位異或( ^ )

按位或 "^" :兩個數(shù)值的二進(jìn)制補(bǔ)碼對應(yīng)位進(jìn)行運算,相同為 0 , 不同為 1。

這里我們舉例說明:

1 ^3:

1 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0001

3 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0011

---按位異或結(jié)果: 0000 0000... 0000 0010 -> 對應(yīng)十進(jìn)制:2

5 ^0:

5 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0101

0 的二進(jìn)制補(bǔ)碼:0000 0000 ... 0000 0000

---按位異或結(jié)果: 0000 0000... 0000 0101 -> 對應(yīng)十進(jìn)制:5

結(jié)論:任何數(shù)異或0都等于它本身

這里有一道筆試題:不創(chuàng)建臨時變量,實現(xiàn)兩個數(shù)的交換。

//很多小伙伴直接想出來的做法:
int main()
{
    int a = 10;
    int b = 20;
    printf("a = %d, b = %d\n", a, b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

但是我們仔細(xì)研究下這段代碼,他有沒有什么隱藏的問題呢?

一個整型,占四個字節(jié),也就是 32 個比特位,這里進(jìn)行加法運算,就會產(chǎn)生進(jìn)位,萬一我們是兩個很大的數(shù)相加呢?他們的和超過了整型最大存儲范圍,那么在計算機(jī)里面就會發(fā)生截斷!為了避免發(fā)生這種現(xiàn)象,我們可以采取異或的方法來實現(xiàn)這道題:

最后還有一個很簡單的按位取反操作符:~

用途:對一個數(shù)的二進(jìn)制按位取反(包括它的符號位)

注意:以上的位運算符,他們的操作數(shù)必須是整數(shù)!

1.3 一個關(guān)于整型提升的問題

有這樣一串代碼,問:為什么一個char類型大小可以求出來是4字節(jié)?

無論任何位運算符,都是要計算機(jī)進(jìn)行計算的,而計算機(jī)中CPU具有運算能力,但計算的數(shù)據(jù)都是放在內(nèi)存中的。所以,做任何運算,都必須將數(shù)據(jù)從內(nèi)存拿到CPU的寄存器中。而寄存器默認(rèn)的操作數(shù)寬度是32位,可是,char類型數(shù)據(jù)只有1個字節(jié),也就是8位,不滿足32位怎么辦,這就需要整型提升了!(詳細(xì)整型提升大家可以查閱資料哦)

如果是一個有符號數(shù)的話:高位補(bǔ)符號位

如果是一個無符號數(shù)的話:高位補(bǔ)0

2、移位操作符

2.1 左移<< 右移>>操作符

<< 左移運算符是一個雙目運算符,功能是把左邊的運算數(shù)的各個二進(jìn)制位向左移動指定位數(shù)。

>> 右移運算符是一個雙目運算符,功能是把右邊的運算數(shù)的各個二進(jìn)制位向右移動指定位數(shù)。

注意:

<< 左移:最低位丟棄,最高位補(bǔ)零

>> 右移:

  1. 無符號數(shù):最低位丟棄,最高位補(bǔ)零 [邏輯右移]
  2. 有符號數(shù):最低位丟棄,最高位補(bǔ)符號位 [算數(shù)右移]

以上在補(bǔ)碼中進(jìn)行運算

警告:移位運算符,請不要移動負(fù)數(shù)位,這是標(biāo)準(zhǔn)未定義的!

左移我們好說,主要是右移我們需要細(xì)講一下:

明顯看到,這是在無符號數(shù)下進(jìn)行右移,第一個小伙伴都不會感到驚訝, 可是第二個就有點不理解了,我們來解釋下:

這里有一個問題,當(dāng) -1 準(zhǔn)備放入變量 b 的時候我們需要看-1的類型嗎?

答案是不需要!內(nèi)存中放的都是二進(jìn)制補(bǔ)碼,本質(zhì)上是把 -1 的補(bǔ)碼放入變量 b 當(dāng)中,第二,右移操作符屬于計算,需要在CPU中進(jìn)行,所以需要先把內(nèi)存中 -1 的補(bǔ)碼拿到CPU寄存器中運算,按照我們的規(guī)則,右移中,無符號數(shù)低位丟棄高位補(bǔ)零,所以 -1 右移完成之后就變成了 0111 1111 ... 1111 1111,接著我們以 %d 有符號整型打印,就會把他當(dāng)作有符號數(shù)看待,最高位是 0 所以被認(rèn)為是正數(shù),轉(zhuǎn)化成十進(jìn)制也就是如上打印的值。

第二個我們來看下有符號數(shù)右移:

這個相信大家就很好理解了,第一個高位補(bǔ)符號位也就是補(bǔ) 0,低位丟棄,所以結(jié)果是 0,第二個高位補(bǔ)符號位也就是補(bǔ) 1,低位丟棄,值仍然不變,還是 -1。

注意:a>>1 并不會改變 a 變量的值,就好比如 a + 1。這樣寫才會改變:a = a >> 1;

2.2 習(xí)題練習(xí)

學(xué)完了上期的邏輯操作符,和本期的移位操作符,我們來練練手:

請你設(shè)計一個宏可以指定數(shù)據(jù)第幾個比特位更改為 1 ,并設(shè)計一個函數(shù)將各個比特位打印出來。

//參考
#define SETBIT(a, num) ((a) |= (1 << (num - 1)) )
void PrintBit(int a)
{
    int num = 31;
    while (num >= 0)
    {
        if ((a & (1 << num)))
            printf("1");
        else
            printf("0");
        --num;
    }
    printf("\n");
}
int main()
{
    int a = 0;
    SETBIT(a, 5);
    PrintBit(a);
    return 0;
}

3、++和--的操作

3.1 基本操作

其實這節(jié)知識點理解起來是很簡單的,只不過總有些學(xué)校喜歡出一些很拉跨的題目:

int i = 3; 問:(++i) + (++i) + (++i) 的值是多少?

我的建議是,看到這類題,直接空著,你也可以在下面添一句,“ 你禮貌嗎?”

這種表達(dá)式,在任何編譯器下算出來的結(jié)果是不一樣的!

對于這種問題沒必要去爭論誰對誰錯, 如果有人想跟你杠的話,那么你直接告訴他,你真的超級高水平。

好了,言歸正傳,我們來說一下 ++ 和 -- 的基本理解:

  1. 前置++ -- :先自增(減),再使用
  2. 后置++ -- : 先使用,再自增(減) 如果沒有變量接收,那么直接自增。

例子:

基本使用就是這么多,接下來我們從匯編角度來深度理解一下:

3.2 從匯編角度深入理解a++

既然我們知道,后置++ 是先使用后++,如果我們單純的就 ++ 一下呢,他這個值被使用到了哪里去了呢?

int main()
{
    int a = 0xDD;
    int b = a++; //有b接收,那么a的先使用是將a的值(內(nèi)容),放到b中
    int c = 0xEE;
    c++; //沒有接收方,那么"先使用",如何理解?
    return 0;
}

vs2019編譯器反匯編:

結(jié)論:后置++ 完整的含義是先使用,在自增,如果沒有變量接收,那么直接自增。

注意:在不同的編譯器可能處理過程不同,不過這是一個基本的研究過程,比單純的理論學(xué)習(xí)更嚴(yán)謹(jǐn)。

到此這篇關(guān)于C語言各種符號的使用介紹下篇的文章就介紹到這了,更多相關(guān)C語言符號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)遍歷文件夾中的文件

    C語言實現(xiàn)遍歷文件夾中的文件

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言實現(xiàn)遍歷文件夾中的文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-02-02
  • C++?指針常量和常量指針的區(qū)別小結(jié)

    C++?指針常量和常量指針的區(qū)別小結(jié)

    在C++學(xué)習(xí)使用過程中,每個人都不可避免地使用指針,而且都或多或少的接觸過常量指針或指針常量,本文主要介紹了C++?指針常量和常量指針的區(qū)別小結(jié),感興趣的可以了解一下
    2023-12-12
  • QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化

    QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化

    本文主要介紹了QT中QByteArray與char、int、float之間的互相轉(zhuǎn)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言?隊列的實現(xiàn)全解析

    C語言?隊列的實現(xiàn)全解析

    隊列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點:隊列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊尾添加元素,在隊頭刪除元素
    2022-04-04
  • c語言實現(xiàn)足球比賽積分統(tǒng)計系統(tǒng)

    c語言實現(xiàn)足球比賽積分統(tǒng)計系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了c語言實現(xiàn)足球比賽積分統(tǒng)計系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實現(xiàn)靜態(tài)鏈表

    C++實現(xiàn)靜態(tài)鏈表

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)靜態(tài)鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • VS2019中QT連接及使用的方法步驟

    VS2019中QT連接及使用的方法步驟

    這篇文章主要介紹了VS2019中QT連接及使用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 使用QT連接USB攝像頭的方法

    使用QT連接USB攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了使用QT連接USB攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 用C實現(xiàn)PHP擴(kuò)展 Image_Tool 圖片常用處理工具類的使用

    用C實現(xiàn)PHP擴(kuò)展 Image_Tool 圖片常用處理工具類的使用

    該擴(kuò)展是基于ImageMagick基礎(chǔ)實現(xiàn)的,圖片操作調(diào)用的是ImageMagick API
    2013-04-04
  • C++基本用法實踐之模板詳解

    C++基本用法實踐之模板詳解

    C++的模板是泛型編程思想的一種實現(xiàn),模板不光支持函數(shù)模板,還有類模板等,本文主要來和大家聊聊C++中模板的相關(guān)用法,需要的可以參考一下
    2023-07-07

最新評論

定边县| 丁青县| 抚宁县| 美姑县| 昌江| 永安市| 巴马| 宁德市| 连平县| 关岭| 麻江县| 高邮市| 乌海市| 土默特右旗| 大庆市| 汤阴县| 彭州市| 呼玛县| 湖北省| 慈溪市| 安化县| 天峻县| 鹤岗市| 上饶县| 株洲市| 保德县| 曲麻莱县| 贞丰县| 武义县| 新余市| 克东县| 崇文区| 博湖县| 泾川县| 临江市| 新津县| 连云港市| 乌兰浩特市| 伊宁县| 大宁县| 宿迁市|