記得點擊查看
點擊查看代碼
1.算數操作符
{
a.+ 加號
b.- 減號
c.* 乘號
d./ 除號 { 計算兩數相除的商,當 / 的兩邊都為整形時,計算結果默認為 int 。當 / 兩邊任意一邊出現小數,計算結果為float or double}
e.% 取模 { % 計算的時兩數相除後的餘數,其兩邊必須為 int ,整除時結果為 0 }
}
2.移位操作符(只能對於 int 使用,無符號整型這裏算作正數//移位操作符移動的位數不能為負數,標準未定義這種寫法,所以在不同編譯器中有不同結果)
{
a.<< 左移 { 對整數的補碼左移一位,左邊丟棄,右邊補零 }
b.>> 右移 { 對整數的補碼右移一位 算數移位:右邊丟棄,左邊補原符號位 //算數移位和邏輯移位取決於編譯器,大部分是算數移位
邏輯移位:右邊丟棄,左邊補零
}
//整數的二進制表達有三種
(原碼,反碼,補碼)
//對於正整數的三種表達相同,而負整數有不同的表達
//例:
【
7
00000000 00000000 00000000 00000111——32位原碼
00000000 00000000 00000000 00000111——32位反碼 // 由於 int 類型佔據 4 個字節,所以其在內存中以32 bit的 2 進制存儲,第一位為字符位,為 1 表示負數,0 為正數 ;
00000000 00000000 00000000 00000111——32位補碼
-7
10000000 00000000 00000000 00000111——32位原碼
11111111 11111111 11111111 11111000——32位反碼 //反碼就是將除字符位以外的bit位由 1 變為 0 ,由 0 變為 1 ;
11111111 11111111 11111111 11111001——32位補碼 //補碼就是在反碼的基礎上 + 1 ;
int a = 7;
int b = 0;
b = a << 1; //此時輸出 b 的結果為 14 —————— 00000000 00000000 00000000 00001110
int c = -7;
b = c << 1; //此時輸出 b 的結果為 -14 ————— 11111111 11111111 11111111 11110010補碼 —— 11111111 11111111 11111111 11110001反碼 —— 10000000 00000000 00000000 00001110原碼
】
}
3.位操作符(計算時兩邊的操作數要為 int)
{
a.& 按位與 //與:對於兩個二進制數,&的兩邊都為1,與的結果為1,兩邊只要有0,結果為0
b.| 按位或 //或:對於兩個二進制數,|的兩邊都為0,或的結果為0,兩邊只要有1,結果為1
c.^ 按位異或 //異或:對於兩個二進制數,相同結果為0,相異結果為1
按位的含義就是按補碼的二進制位,每位單獨進行比較
//例1:
int a = 8; //00000000 00000000 00000000 00001000 8的補碼
int b = -4; //11111111 11111111 11111111 11111100 -4的補碼
a & b = //00000000 00000000 00000000 00001000 結果的補碼,由於是正數,所以原碼也是這個,結果為8
a | b = //11111111 11111111 11111111 11111100 結果的補碼 —— 11111111 11111111 11111111 11111011反碼—— 10000000 00000000 00000000 00000100原碼,結果為-4
a ^ b = //11111111 11111111 11111111 11110100 補碼 —— 11111111 11111111 11111111 11110011反碼 —— 10000000 00000000 00000000 00001100原碼,結果為-12
//例2:
int main()
{
int a = 10;
int b = 20;
a = a ^ b;//10^20
b = a ^ b;//10^20^20 //不建立新變量,交換兩個數值,只適用於int
a = a ^ b;//10^20^10 (20^20=0)
}
}
4.賦值操作符
{
a.= 賦值
賦值操作符可以連續使用
例:
int a = 10;
int b = 20;
int c = 30;
a = b = c + 10;//輸出的結果為a=40,b=40
b.複合賦值操作符
+=
-=
*=
/=
%=
^=
&=
|=
<<=
>>=
例:
int a = 0;
a = a + 1;
a +=1; //這兩種寫法結果是相同的,其他的複合賦值操作符同理
}
5.單目操作符(只有一個操作數)
{
! 邏輯反操作//把真轉為假,把假轉為真,C語言中一般把0視為假,非零視為真
- 負號
+ 正號
& 取地址(字面意思,取出一個變量的首地址)
sizeof(操作數) 計算操作數的字節長度(所佔內存大小,類型,變量,數組等)//sizeof後的括號在某些情況下是可以省略的
~ 對操作數按位取反
{
int a = 10; //00000000 00000000 00000000 00001010 補碼
a = ~a; //11111111 11111111 11111111 11110101 結果的補碼——11111111 11111111 11111111 11110100反碼——10000000 00000000 00000000 00001011原碼,結果為-11
a |=(1<<5);
a &=(~(1<<5))//這兩個公式算出來的結果相同,這也是這些符號的一些用法,目的是對與a中存儲的32位比特的任意一位進行修改
}
++ 自增 前置++:先++再使用 後置++:先使用後++ //++可以看作a = a + 1
-- 自減 前置--:先--再使用 後置--:先使用後-- //--可以看作a = a - **1
//對操作數加一或減一,**對於使用操作數的場景,其放在操作數前後產生效果不同**
* 間接訪問操作符(解引用操作符)
{
int a =10;
int* p = &a;
*p = 20;//此時a中的值變為二十,*的作用就是通過p中存放的地址找到a變量,所以*p就等於a
}
(類型) 強制類型轉換
{
int a = (int)58.5148951;//a現在等於58,相當於把浮點型強制轉換成了整數,後面的小數位丟失了
}
}
6.關係操作符 (不是所有內容都可以用關係操作符比較)
{
> 大於
< 小於
>= 大於等於
<= 小於等於
!= 不等於
== 等於 (一定要注意不要把==寫成=,一個是等於,一個是賦值)
}
7.邏輯操作符//只對真假進行判斷,結果也只有0或1
{
&& 邏輯與(全真為真,一假則假)//當其左邊為假,直接出結果,右邊整個過程不進行計算
{
int a = 4;
int b = 3;
int c = 0;
int d = a && b//此時d的值為 1
int e = b && c//此時e的值為 0
}
|| 邏輯或(一真則真,全假為假)//當其左邊為真,直接出結果,右邊整個過程不進行計算
{
int a = 4;
int b = 3;
int c = 0;
int d = a || b;// 1
int e = b || c;// 1
d = 0;
e = d || c;// 0
}
}
8.條件操作符//三目操作符(從左向右依次計算)
{
表達式1 ? 表達式2 :表達式3
//表達式1如果為真,則計算表達式2,表達式2的結果為整個表達式的結果,表達式3不進行計算
//表達式1如果為假,則計算表達式3,表達式3的結果為整個表達式的結果,表達式2不進行計算
}
9.逗號表達式
{
表達式1,表達式2,表達式3,表達式4,.....,表達式n
//逗號表達式就是用逗號隔開的多個表達式,從左到右依次執行,表達式的結果就是最後一個表達式的結果
例子
{
while(a = get_val(), count_val(a),a > 0 )
{
;
}
//等價於
do
{
a=get_val();
count_val(a);
}while(a>0)
}
}
10.
{
a.下標引用操作符
[]
{
int arr[10] = { 0 };
arr[9]=10;//使用下標引用,兩個操作數分別為數組名和下標數9
9[arr]=10;//兩者可以交換arr[9] ---> *(arr + 9) ---> *(9 + arr) --->9[arr]
}
b.函數調用操作符
()
{
//函數定義
int ADD(int a, int b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
//函數調用
int c = ADD(a,b);//()就是函數調用操作符,操作數為函數名和參數,至少有一個操作數(函數名)
return 0;
}
}
c.訪問結構體成員
-> 結構體指針變量 -> 成員名
. 結構體名 . 成員名
{
#include<stdio.h>
#include<string.h>
struct a
{
char name[20];
int age;
double score;
}
void set_a(struct a* s)
{
strcpy((*s).name,"zhangsan");
(*s).age = 18;
(*s).score = 100.00;
//or strcpy(s->name,"zhangsan");
// s->age = 18;
// s->score = 100.00
}
void print_a(struct a s)
{
printf("%s %d %lf",s.name,s.age,s.score);
}
int main()
{
struct a s = { 0 };
set_a (&s);
print_a(s);
return 0;
}
}
}
總結:操作符的計算順序呢,是由優先級和結合性來共同決定的