目錄
1.?操作符的分類
2. ?進制和進制轉換
2.1 2進制轉10進制
2.2 10進制轉2進制
2.3?2進制轉8進制
2.4?2進制轉16進制
3.?原碼、反碼、補碼
4.?移位操作符
4.1?左移操作符
4.2?右移操作符
5.?位操作符:&、|、^、~
5.1?& 按位與
?5.2?| ?按位或
5.3?^ ?按位異或
5.4?~ ?按位取反
6.?結構成員訪問操作符
?6.1 什么是結構體
6.2 結構體成員的直接訪問
6.3?結構體成員的間接訪問
7.?操作符的屬性:優先級與結合性
7.1?優先級
7.2?結合性
1.?操作符的分類
1. 算術操作符:+? ?-? ?*? ?/? ?%
2. 移位操作符:<<? ?>>
3. 位操作符:&? |? ^
4. 賦值操作符:=? +=? -=? =? /=? %=? <<=? >>=? &=? |=? ^=
5. 單目操作符:!? ++? –? &? *? +? ?-? ?~? ?sizeof? (類型)
6. 關系操作符:>? >=? <? <=? ==? !=
7. 邏輯操作符:&&? ||
8. 條件操作符:?:
9. 逗號表達式:,
10. 下標引用:[ ]
11. 函數調用:( )
12. 結構體成員訪問: .? ? ? ->
?
?
2. ?進制和進制轉換
?
其實我們經常能聽到2進制、8進制、10進制、16進制這樣的講法,那是什么意思呢?其實2進制、8進制、10進制、16進制是數值的不同表?形式?已
二進制:
??
2進制中滿2進1,2進制的數字每?位都是0~1的數字組成:
? ?128? 64? 32? 16? 8? 4? 2? 1
??
十進制12的二進制就是1100,也就是取上面8 4 2 1的前兩位
2.1 2進制轉10進制
10進制中的123,從右到左依次是個位,十位,百位,每一位都有自己的權重,每一位各自乘以各自的權重然后加和就是表示的值
2進制轉換10進制的12也相同
2.2 10進制轉2進制
2.3?2進制轉8進制
8進制的數字每?位是0~7的,0~7的數字,各?寫成2進制,最多有3個2進制位就?夠了,?如7的?進制是111,所以在2進制轉8進制數的時候,從2進制序列中右邊低位開始向左每3個2進制位會換算?個8進制位,剩余不夠3個2進制位的直接換算
如:2進制的01101011,換成8進制:0153,0開頭的數字,會被當做8進制
2.4?2進制轉16進制
16進制的數字每?位是0~9,a ~f 的,0~9,a ~f的數字,各?寫成2進制,最多有4個2進制位就?夠了,?如 f 的?進制是1111,所以在2進制轉16進制數的時候,從2進制序列中右邊低位開始向左每4個2進制位會換算?個16進制位,剩余不夠4個?進制位的直接換算
在16進制中,兩位數用字母表示(大小寫都可以)
??
10 = A/a????????11 = B/b????????12 = C/c????????13 = D/d????????14 = E/e????????15 = F/f
如:2進制的01101011,換成16進制:0x6b,16進制表?的時候前?加0x
3.?原碼、反碼、補碼
整數的2進制表示方法有三種,即原碼、反碼和補碼
? ?
有符號整數的三種表示方法均有符號位和數值位兩部分,2進制序列中,最?位的1位是被當做符號位,剩余的都是數值位? ?
符號位都是?0表?“正”,?1表?“負”
正整數的原、反、補碼都相同
負整數的三種表示方法各不相同
? ?
原碼:直接將數值按照正負數的形式翻譯成?進制得到的就是原碼
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到反碼
補碼:反碼+1就得到補碼? ??
反碼得到原碼也是可以使用:取反,+1的操作??
數據存放內存中其實存放的是補碼
4.?移位操作符
移位操作符的操作數只能是整數,移動操作符移動的是二進制位
4.1?左移操作符
?移位規則:左邊拋棄、右邊補0,左移的效果和乘2類似
#include <stdio.h>int main()
{int num = 10;int n = num << 1;printf("n= %d\n", n);printf("num= %d\n", num);return 0;
}
4.2?右移操作符
與左移操作符的效果相反,右移的效果和除2類似
? ?
移位規則:右移運算分兩種:
? ?
1. 邏輯右移:左邊?0填充,右邊丟棄? ?
? ?
2. 算術右移:左邊用原該值的符號位填充,右邊丟棄? ?
??
? ??
? ?
#include <stdio.h>int main() {int num = 10;int n = num >> 1;printf("n= %d\n", n);printf("num= %d\n", num);return 0; }
? ?
對于移位運算符,不要移動負數位,這個是標準未定義的
? ?
例如:
? ?
int num = 10; num>>-1;
?
5.?位操作符:&、|、^、~
& //按位與
| //按位或
^ //按位異或
~ //按位取反
位操作符的操作數必須是整數
5.1?& 按位與
當兩個對應的二進制位都為 1 時,結果位才為 1,否則為 0,也就是同1為1,不1為0
0000000000 0000000000 0000000001 11 a
0000000000 0000000000 0000011000 11 b0000000000 0000000000 0000000000 11 a & b
?5.2?| ?按位或
當兩個對應的二進制位中只要有一個為 1,結果位就為 1,當兩個位都為 0 時,結果位才為 0
??
也就是有1為1,無1為0
0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b0000000000 0000000000 0000000001 11 a | b
5.3?^ ?按位異或
當兩個對應的二進制位不同(一個為 0,另一個為 1)時,結果位為 1,當兩個位相同(都為 0 或都為 1)時,結果位為 0
? ?
也就是不同為1,相同為0
0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b0000000000 0000000000 0000000001 10 a ^ b
5.4?~ ?按位取反
顧名思義,將每個二進制位中的 0 變為 1,1 變為 0
0000000000 0000000000 0000000001 01 a1111 1111 11 1111 1111 11 1111 1111 10 10 ~a
6.?結構成員訪問操作符
? ?
?6.1 什么是結構體
結構是?些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量,如:
標量、數組、指針,甚?是其他結構體
結構體的語法結構:
struct tag
{member - list;}variable - list;
描述?個學生:
struct Stu{char name[20];//名字int age;//年齡 char sex[5];//性別char id[20];//學號 }; //分號不能丟
結構體的定義:
struct Point{int x;int y;}p1; //聲明類型的同時定義變量p1
struct Point p2; //定義結構體變量p2
結構體的指定順序初始化:
//指定順序初始化
struct Point p3 = { 10, 20 };
struct Stu //類型聲明
{char name[15];//名字int age;//年齡
};
struct Stu s1 = { "zhangsan", 20 };//初始化
struct Stu s2 = { .age = 20, .name = "lisi" };//指定順序初始化
結構體嵌套初始化:
struct Node
{int data;struct Point p;struct Node* next;}n1 = { 10, {4,5}, NULL };//結構體嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//結構體嵌套初始化
6.2 結構體成員的直接訪問
?
結構體成員的直接訪問是通過點操作符(.)訪問的,點操作符接受兩個操作數
??
語法結構:結構體變量.成員名
#include <stdio.h>struct Point
{int x;int y;
}p = { 1,2 };int main()
{printf("x: %d y: %d\n", p.x, p.y);return 0;
}
?
6.3?結構體成員的間接訪問
有時候我們得到的不是?個結構體變量,?是得到了?個指向結構體的指針
??
語法結構:結構體指針->成員名
#include <stdio.h>
struct Point
{int x;int y;
};int main()
{struct Point p = { 3, 4 };struct Point* ptr = &p;ptr->x = 10;ptr->y = 20;printf("x = %d y = %d\n", ptr->x, ptr->y);return 0;
}
7.?操作符的屬性:優先級與結合性
優先級與結合性決定了表達式求值的計算順序
7.1?優先級
優先級指的是,如果?個表達式包含多個運算符,哪個運算符應該優先執?,各種運算符的優先級是不?樣的
??
舉個例子:1 3 + 4 * 5;
??
上??例中,表達式 3 + 4 * 5 ??既有加法運算符( + ),?有乘法運算符( * )。由于乘法的優先級?于加法,所以會先計算 4 * 5 ,?不是先計算 3 + 4?
7.2?結合性
如果兩個運算符優先級相同,優先級沒辦法確定先計算哪個了,這時候就看結合性了,則根據運算符是左結合,還是右結合,決定執?順序
? ??
?部分運算符是左結合(從左到右執?),少數運算符是右結合(從右到左執?),?如賦值運算符( = )
一般來說:!>?算術運算符?> 關系運算符 > 邏輯運算(&& > ||) > 賦值運算符?
優先級鏈接:
??
C 運算符優先級 - cppreference.com
https://zh.cppreference.com/w/c/language/operator_precedence?
如寶石般璀璨