操作符詳解(上)
- 一,算術操作符(雙目操作符)
- 1:‘+’,‘-’,‘*’
- 2:‘/’,‘%’
- 一,單目操作符
- 1:‘+’,‘-’
- 2:‘!’
- 3:‘&’
- 4:‘*’
- 5:‘sizeof’
- 6:‘++’與‘--’
- 三,移位操作符
- 3.1 <<(左移操作符)
- 3.2 <<(左移操作符)
- 3.2 >>(右移操作符)
- 四.位操作符
- 4.1‘&’按位與
- 4.2‘|’按位或
- 4.3‘^’按位異或
- 4.4‘~’按位取反
我們了解在C語言中有許多的操作符,這里我們詳細介紹部分操作符
一,算術操作符(雙目操作符)
1:‘+’,‘-’,‘*’
這三種算數操作符就相當于數學運算中的加法,減法,和乘法,是對兩個數進行數學運算,
int a=1;
int b=2;
\\加法
int c=a+b;(結果為3)
\\減法
int c=b-a;(結果為1)
\\乘法
int c=a*b;(結果為2)
2:‘/’,‘%’
==‘/’==進行的操作相當于數學運算中的除法,但有些許不同,分為兩種情況
第一種:當該操作符兩端都為整形,結果也為整形,該操作符是將兩數相除取商,例如5/3應該是商1余2,但結果只會顯示商1
第二種:若想要輸出的結果為小數,那么就需要除號兩邊之一為浮點數,并且輸出的結果也要為浮點數,
‘%’ 進行的操作為將%號兩邊的數相除取余,例如5/3應該是商1余2,但結果只會顯示余數2,
因為上述操作符運算所需變量為兩個,也就是運算對象的個數是2,所以又被稱作雙目操作符。
一,單目操作符
1:‘+’,‘-’
這里的‘+’,‘-’并不是算數中的加號與減號,而是表示正數與負數,通常來說負數前會有‘-’號,而正數前的‘+’號通常省略。
2:‘!’
'!'為邏輯反操作符,用于對布爾值進行反轉,舉個例子:條件判斷中,一般條件成立即為真,布爾值為非0,加上!后非0為假,0為真,也就是條件成立為假,不成立為真,我們設計一個簡單的代碼來看一下具體效果:
#include<stdio.h>
int main()
{int a = 0;while (scanf("%d", &a) != EOF){if (a > 0){printf("%d\n", a);}else{printf("NO\n");}}return 0;
}
這是沒有加‘!’操作符時的結果,
#include<stdio.h>
int main()
{int a = 0;while (scanf("%d", &a) != EOF){if(!(a > 0)){printf("%d\n", a);}else{printf("NO\n");}}return 0;
}
這是加上!操作符后的結果。
3:‘&’
用于獲取變量的內存地址。
4:‘*’
間接引用和解引用操作符,獲取指針所指向的值。
5:‘sizeof’
用于獲取數據類型或對象在內存中的大小(以字節為單位)
6:‘++’與‘–’
自增‘++’與自減‘–’,作用分別為將操作數的值增加1和減少1。
在實際操作中又分為前置和后置兩種情況,
‘++’和‘–’前置為操作數先變化后使用,后置為操作數先使用后變化,如下圖所示:
#include<stdio.h>
int main()
{int a = 1;int b = 1;int c = 1;int d = 1;printf("%d\n",++a);printf("a=%d\n",a);printf("%d\n",b++);printf("b=%d\n",b++);printf("%d\n",--c);printf("c=%d\n",--c);printf("%d\n",d--);printf("d=%d\n",d--);return 0;
}
其輸出結果為:
這里可以看到前置和后置操作符最終輸出的結果并不相同。
介紹完C語言中比較簡單的兩種操作符,我們再來介紹一下比較復雜的操作符,位操作符
三,移位操作符
在介紹移位操作符前,還得先介紹十進制數字在計算機中的存儲方式以及源碼,反碼,補碼。
十進制數在計算機中通常不是直接儲存的,而是先轉化位二進制數在進行存儲。而為了區分正負數,計算機對有符號整數采用了不同的編碼儲存方式,也就是源碼,反碼,補碼。
在現代的計算機中主要采用的數字集成電路完成,數字電路通過高低電平只能表示0和1,所以就出現了,計算機只會識別0和1。無論是存儲還是計算,計算機均采用二進制體系完成。
在C語言中不同數據類型的大小不一樣,如int類型每個占4個字節,而每個字節又等于8個比特位。
sizeof(int)=1byte=8bit每個比特位存儲的便是0或1。
一個int類型共有32個比特位,每個比特位只能是0或1,也就是說在計算機中整型是采用二進制的方式存儲的,那么int的取值范圍便是-231~231-1
了解了上面的基本概念后,我們就來詳細了解一下源碼,反碼和補碼,
注意,源碼,反碼和補碼只能應用在整數中
而正整數和負整數的存儲是不一樣的,我們分開討論:
正整數:正整數的源碼=反碼=補碼
負整數:負整數在計算機中是以補碼的形式進行儲存的,那么該如何得到負整數的補碼?
首先,我們要了解計算機區分正,負整數的原理,在計算機中為了區分正負整數,在整形的32位比特位中,正整數的最高位比特位為0,而負整數的最高位為1,將負整數的源碼除了最高位的符號位按位取反得到負整數的反碼,反碼加1得到負整數的補碼。
下面以x64環境下的整型存儲為例:
int a=5;
a的源碼=反碼=補碼為:0000 0000 0000 0000 0000 0000 0000 0101
int b=-5;
b的源碼為:1000 0000 0000 0000 0000 0000 0000 0101反碼為:1111 1111 1111 1111 1111 1111 1111 1010補碼為:1111 1111 1111 1111 1111 1111 1111 1011
而計算機之所以會有三種儲存整形的方式的原因都是因為計算的難易,
源碼的一個缺點是存在兩種不同的表示方式來表示0(0000 和 1000),這可能導致一些不必要的復雜性。
反碼的一個優點是消除了0的兩種表示,但缺點是進行加減運算時相對復雜。
補碼是最常用的表示法,特別是在現代計算機中。補碼的一個主要優點是它使得加法運算更加簡單,因為對于任何整數x,都有 x + (-x) = 0,這在補碼表示下總是成立。另一個優點是只有一個0的表示(0000),這使得處理更加簡單。
下面就介紹2種移位操作符:
>>(右移操作符)和<<(左移操作符)
注意:移位操作符的操作數只能是整數
3.1 <<(左移操作符)
3.2 <<(左移操作符)
移位規則:將整數的補碼整體向左移動一位,左邊的拋棄,右邊空的補0;
演示:
#include<stdio.h>
int main()
{int num = 1;num = num << 1;printf("%d\n", num );return 0;
}
輸出結果:
移位圖解:
3.2 >>(右移操作符)
右移操作符相對左移來說較為復雜,分為邏輯右移和算術右移
邏輯右移:左邊?0填充,右邊丟棄
邏輯右移一位圖解:
算術右移:左邊?原該值的符號位填充,右邊丟棄
圖解:
注意:對于移位運算符,不要移動負數位,這個是標準未定義的
四.位操作符
注意:位操作符的操作數必須是整數
4.1‘&’按位與
該操作符在二進制層面上對兩個數進行操作,它比較兩個數的相應位,只有當兩個相應的位都為1時,結果位才為1,否則為0;
代碼和圖解演示:
#include<stdio.h>
int main()
{int num1 = 6;int num2 = 13;int num3 = num1 & num2;printf("%d\n", num3 );return 0;
}
圖解:(前面為0的位省略)
4.2‘|’按位或
該操作符在二進制層面上對兩個數進行操作,它比較兩個數的相應位,只要兩個數中任意一個數的相應位為1,那么結果位就為1,否則為0;
代碼和圖解演示:
#include<stdio.h>
int main()
{int num1 = 2;int num2 = 13;int num3 = num1 | num2;printf("%d\n", num3 );return 0;
}
圖解:(前面為0的位省略)
4.3‘^’按位異或
該操作符在二進制層面上對兩個數進行操作,它比較兩個數的相應位,當兩個數的相應位不同時,結果位為1;當兩個數的相應位相同時,結果位為0。
代碼和圖解演示:
#include<stdio.h>
int main()
{int num1 = 3;int num2 = 13;int num3 = num1 ^ num2;printf("%d\n", num3 );return 0;
}
圖解:(前面為0的位省略)
4.4‘~’按位取反
該操作符用于對二進制數的每一位執行邏輯非操作。具體地說,它將二進制數中的每個0變為1,每個1變為0。
代碼和圖解演示:
#include<stdio.h>
int main()
{int num1 = 2;num1 = ~num1;printf("%d\n", num1 );return 0;
}
圖解:(前面為0的位省略)