C語言操作符
C語言操作符的分類:
算術操作符 邏輯運算符 位操作符 賦值操作符
單目操作符 關系操作符 條件操作符
逗號表達式 數組下標引用 函數調用 結構體成員使用
大體上,C語言的操作符具體就這麽些,俗話說的好,飯得一口一口吃,知識也得一點一點學習;
首先讓我們來了解一下這些操作符的使用規則和註意事項(坑踩的多了自然就平了,錯誤出的多了自然就開始懷疑人生了(.//囍\\))
1.算術操作符
算術和算數有什麽區別呢?
本質區別在於:算術是數學的一個分支,是數學的最初形式,而算數是動詞,沒有直接關系;如果把算術混淆為算數的話,可是給我們理工科的
鬧了個大笑話了..
進入正題,算術操作符有哪些: + - * / % ++ --
加法運算符(+):是用來進行加法運算的,使其兩側的值相加;
減法運算符(-):是用來進行減法運算的,使其兩側的值相減;
乘法運算符(*):是用來進行乘法運算的,使其兩側的值相乘;
除法運算符(/):是用來進行除法運算的,左側的值是被除數,右側的值是除數.
求模運算符(%):只能用於整數運算不能用於浮點型,求模運算符給出其左側整數除以右側整數的余數;
遞增運算符(++):對運算對象進行+1操作;
遞減運算符( -- ):對運算對象進行-1操作;\
//算術運算符
void Test_1() {
int a = 20;
int b = 10;
//加法運算
printf("a + b = %d\n",a + b);
//減法運算
printf("a - b = %d\n",a - b);
//乘法運算
printf("a * b = %d\n",a * b);
//除法運算
printf("a / b = %d\n",a / b);
//求模運算
printf("a %% b = %d\n",a % b);
}
算術運算符使用註意事項和說明 :
讓我們先了解一下除法的運算規則: 被除數 / 除數 = 商 ......余數 *** 除數不能為0,否則無意義.
1-兩個實數的除法運算結果為一個雙精度浮點數,兩個整數的除法運算結果為一個整形數;如果輸入
( 5 / 3 ) 結果 1;舍去小數部分.
2-%求模運算符的操作數只能為整數,其他的操作數可以是任何的算術類型;
(打印求模運算符%時,需要雙%%來表示).
3-關於++和--我會在後面的單目操作符進行解釋說明;
2.邏輯運算符
在C語言中,邏輯判斷區分真假只有0和非0;
非零的數字能夠轉換成真,也就是數字1;假就是0;
1>分類: && || !
邏輯與 ( && ) :
例如 a && b ; 如果 a 和 b 都為真,那麽結果為真 ,否則為假;
邏輯或( || ) :
例如 a || b ; 如果a 和 b 都為假,那麽結果就為假,否則為真;
邏輯非( ! ) :
例如 !a ; 如果a為真,那麽結果為假,反之,如果a為假,結果為真;
如果你不熟悉運算符或者覺得很別扭,請記住 : (練習 && 時間) == 完美;
2>運算符說明:
邏輯與( && )和邏輯或( || )都是雙目運算符,要求使用它有兩個運算對象;
邏輯非( ! ) 是單目運算符,要求使用它有一個運算對象;
求值順序 :邏輯表達式的求值順序是從左往右,一旦發現有使整個表達式為假的因素,就會立即停止求值;
3.位操作符
分類: & | ^ ~ >> <<
按位與 ( & ) : 通常用於二進制的取位操作,
例如一個數 and 1的結果就是取二進制的最末位,這樣可以進行判斷一個整數的奇偶,
二進制的最末位為0,表示該數位偶數,最末位為1則為奇數;
按位或 ( | ) : 通常用於二進制特定位上的無條件賦值,
例如一個數or 1的結果就是把二進制最末位強行變成1。如果需要把二進制最末位變成0,對這個數按位或( | ) 1之後再減一就可以了,
其實際意義就是把這個數強行變成最接近的偶數。
按位異或 ( ^ ) : 按位異或運算, 對等長二進制模式按位或二進制數的每一位執行邏輯按位異或操作. 操作的結果是如果某位不同則該位為1, 否則該位為0.
按位取反( ~ ) : 就是把所有的二進制位,只要是1就變成0,0變成1;
左移運算符( << ) : a << b,表示對a的二進制數左移b位;
移位規則: 左邊拋棄,右邊補0;
右移運算符( >> ) :
右移運算分為兩種: 1>邏輯移位 : 左邊用0填充,右邊拋棄;
2>算術移位 : 左邊用原該值的符號位填充,右邊拋棄;
4.賦值運算符
分類 : = += *= /= %= >>= <<= &= |= ^=
賦值運算符是把右側表達式的值賦給左側的變量.它們都用於更新變量,其用法都是
左側一個變量名,右側一個表達式.賦給變量的值是由右側表達式的值調整後的值.
註意 和 說明 :
1-註意‘=‘和"=="的區別,很多人都在這裏過問題.(重要的事情說很多遍);
2-賦值運算符的優先級比算術運算符的優先級低;
2-復制運算符是把右側表達式的值賦給左側的變量.它們都用於更新變量,其用法都是
左側一個變量名,右側一個表達式,賦給變量的值是由右側表達式的值調整之後的值決定.
4.雖然這些運算符可以由幾行簡單的代碼表示,並且運行效果一樣,但是使用賦值運算符
可以讓代碼看起來更緊湊,而且與一般代碼相比,賦值運算符可以使生成的機器代碼更高效
5.在使用for循環加入一些復雜的表達式時,復制運算符就很好用.
5.單目操作符
! 邏輯取反操作
- 負值
+ 正值
& 取地址
sizeof 操作符的類型長度(以字節為單位)
(類型) 強制轉換
++ 前置++; 後置++
-- 前置--; 後置--
1>+和-可以表示算術運算,也可以表示數字的符號,
2>&取地址,在C語言中,創建變量時,系統內存會自動給變量分配一段存儲空間,我們不能直接
訪問這些變量,因為我們不知道他們的存儲地址,需要使用&來找到變量的房間號,進而訪問
所需要訪問的變量;
3>sizeof() 是一種內存容量度量函數,功能是返回一個變量或者類型的大小(以字節為單位);
在 C 語言中,sizeof() 是一個判斷數據類型或者表達式長度的運算符.
4> (類型)強制轉換 : 1-(類型說明符)表達式***其功能是將表達式的運算結果強制轉換為括號內的
類型說明符的類型;
2-不管是強制轉換還是自動轉換都是為了本次運算的需要而進行臨時的轉換;
不改變數據說明時對該變量定義的類型
void Test() {
int m = 1;
//m++
printf("%d\n",m++);
//重置m的值為1
m = 1;
//++m
printf("%d\n",++m);
}
自增運算符和自減運算符的前置後置區別:
後置++i : 在使用 i 之前先使 i 的值+1;
前置i++ : 在使用 i 之後再使 i 的值+1;
自減運算符同理.
6.關系運算符
分類 : > >= < <= == !=
說明 :
1-老生常談:"=="和‘=‘的區別,看起來啰嗦了一點,但是還是得說明一下;
2-對於一些復雜的關系表達式:b < a < c
不能直接表示,需要使用邏輯運算符: a > b && a < c;
為什麽?未定義行為,C語言不支持.
7.條件運算符
//使用if-else判斷兩個數的較大值
if(a > b){
max = a;
}
else {
max = b;
}
//使用條件運算符" ? :"判斷兩個數的較大值
max = (a > b) ? a : b;
上面的兩段代碼都可以求出兩個數的較大值,很明顯,使用條件運算符的代碼更簡潔;
條件運算符: ? :
說明 : 條件運算符需要三個操作對象,每個操作對象都是一個表達式,通用形式為:
exp1 ? exp2 : exp3;
如果exp1為真,那麽整個表達式的值為exp2,否則為exp3;
如: (5 > 3) ? 1 : 2; 值為1;
(3 > 5) ? 1 : 2; 值為2;
(a > b) ? a : b; 如果a > b,則取較大的值.
8.逗號運算符
逗號運算符把兩個表達式連接成一個表達式,並保證最左邊的表達式最先求值.
逗號運算符通常在for循環頭的表達式中用於包含更多的信息,整個逗號表達式的值
是逗號右側表達式的值;
#include<stdio.h>
int main(){
int i = 0;
i = 1, i = 10;
printf("i = %d\n",i);
return 0;
}
輸出結果為:
i = 10
9.數組下標引用
[ ]變址運算符活著稱為下標引用操作符
操作形式: 數組名 + [索引值]
int arr[4] = {4,3,9,6};//註意索引值不能越界
printf("arr[3] = %d\n",arr[3]);
//[ ]的兩個操作數就是arr(數組名)和3(索引值)
10.函數調用操作符
接收一個或多個操作數:第一個操作數是函數名,剩余的操作數就是傳遞給函數的參數;
#include<stdio.h>
void Test(){
printf("Hello BKY!\n");
}
void Add(int x,int y){
printf("%d\n",x+y);
}
int main(){
//第一種是沒有參數傳遞的,直接函數名+();
Test();
//第二中是傳參的形式,函數名+(參數1,參數2);
Add(10,20);
return 0;
}
11.結構體成員使用
訪問一個結構體的成員有兩種形式:
1> 結構體.成員名;
2> 結構體指針->成員名;
#define SIZE 100
struct Stu{
char num[SIZE];
char name[SIZE];
};
struct Stu Stu;
//使用結構體變量名引用成員
void Print_1() {
strcpy(Stu.num, "001");
strcpy(Stu.name, "飄雪");
printf("Stu.num = %s\n",Stu.num);
printf("Stu.name = %s\n",Stu.name);
}
struct Stu *p;
//使用結構體指針引用成員
void Print_2() {
p = &s
strcpy(p->num, "002");
strcpy(p->name, "無情");
printf("p->num = %s\n",p->num);
printf("p->name = %s\n",p->name);
}
C語言操作符