### 操作符
**運算操作符**
C語言里采用操作符表示對數字的處理規則。
根據需要配合的數字個數把操作符分成三類,分別是單目操作符,雙目操作符和三目操作符。
單目操作符:僅需要一個數字配合使用的操作符,例如:++ --。
雙目操作符:需要兩個數字配合使用的操作符,例如:+ - * /等。
三目運算符:需要三個數字來配合使用的操作符, 例如: .. ? .. : ..。
雙目運算符還有其他的。
% 也是一個雙目操作符,它表示取余。
/*
取余操作符
*/
#include <stdio.h>
int main(){
printf("15 % 6 = %d\n", 15 % 6);
return 0;
}
**賦值操作符**
賦值操作符(=)可以吧一個數字放到存儲區里。
賦值語句可以當做數字使用,這個數字就是賦值完成后存儲區里的數字。
可以在一條語句里使用多個賦值操作符,這個時候先計算右邊的賦值操作符,后計算左邊的。
#include <stdio.h>
int main(){
char ch = 0;
int num = 0;
num = ch = 300;
printf("num = %d\n", num);
return 0;
}
雙目操作符和賦值操作符合并,形成了復合賦值操作符, 例如: +=, *=等。;
復合賦值操作符要求左邊的內容可以代表存儲區,右邊的內容可以代表數字。
它首先用雙目操作符對左右兩邊的內容做計算,然后把計算結果記錄到左邊的存儲區里。
#include <stdio.h>
int main(){
int num = 44;
num += 6;
printf("num = %d\n", num);
return 0;
}
復合賦值操作符的優先級和賦值操作符的優先級一樣低。
自增操作符(++)和自減操作符(--)都是單目操作符。
它們都應該和存儲區配合使用。
它們可以把存儲區里的內容加一或者減一。
它們各有兩種使用方法,一種是前操作(操作符寫在存儲區前面),另外一種是后操作符(操作符寫在后面)。
前操作語句當作數字使用的時候是修改后的數字,后操作語句當作數字使用的時候是修改前的數字。
#include <stdio.h>
int main(){
int num = 10;
printf("num = %d\n", num++);
printf("num = %d\n", ++num);
return 0;
}
返回結果:
num = 10
num = 11
不要在一條語句里對同一個變量多次進行自增或者自減計算,因為結果是不確定的。
**邏輯表達式**
邏輯表達式的計算結果一定是布爾值。
邏輯操作符就是用來編寫邏輯表達式的。
有一個求反的單目邏輯操作符,是 ! ,它可以計算一個布爾值的相反值。
這個操作符應該寫在一個布爾值的前面。
/*
邏輯操作符演示
*/
#include <stdio.h>
int main(){
printf("!8 = %d\n", !8);
return 0;
}
返回結果:
!8 = 0
雙目邏輯操作符包括==(等于),不等于(!=),大于(>),小于(<),大于等于(>=),小于等于(<=)。
最多包含一個雙目邏輯操作符的表達式在計算機里的結果和數學里的結果一定一樣。
可以把最多包含一個雙目邏輯操作符的表達式,叫做簡單邏輯表達式。
所有邏輯表達式必須拆分成多個簡單邏輯表達式然后在我合并,和數學里的方法并不是完全一樣的。
/*
邏輯操作符演示
*/
#include <stdio.h>
int main(){
printf("3 < 7 < 5 = %d\n", 3 < 7 < 5);
return 0;
}
返回結果:
3 < 7 < 5 = 1 // 1 = True
與(&&)、或(||)也是雙目邏輯操作符,它們可以用來合并多個邏輯表達式。
如果兩個邏輯表達式中有一個的結果是假則用 與(&&) 合并后的結果一定是假。
如果兩個邏輯表達式中有一個的結果是真則用 或(||) 合并后的結果一定是真。
與(&&)、或(||)都有一個短路的特征,如果前面的邏輯表達式可以決定最終結果,則計算機就會忽略后面了邏輯表達式。
### 位操作符
位操作符是直接操作二進制數位。
~是一個單目位操作符,這個操作符可以根據一個數字計算出另外一個數字,這兩個數字在所有二進制數位上的內容都一樣。
~叫做按位求反操作符。
這個操作符應該寫在一個數字前面。
/*
位操作符演示
*/
#include <stdio.h>
int main(){
char ch = ~0xc3; // 0xc3 | 11000011
int num = ch;
printf("ch = 0x%x\n", num);
return 0;
}
返回結果:
0x3c | 00111100
雙目位操作符包括:
* 按位與(&)
* 按位或(|)
* 按位異或(^)
它們可以把兩個數字對應二進制數位上的內容進行計算。
**按位與(&)**
按位與(&)可以把數位上的內容做與計算。
只要有一個數位內容是0則計算結果就是0。
/*
按位與
*/
#include <stdio.h>
int main(){
printf("3 & 5 = %d\n", 3 & 5);
return 0;
}
返回結果:
3 & 5 = 1
0000 0011 & 0000 0101 = 0000 0001
**按位或(|)**
按位或(|)可以把數位上的內容做或計算。
只要有一個數位內容是1則計算結果就是1。
/*
按位或
*/
#include <stdio.h>
int main(){
printf("3 | 5 = %d\n", 3 | 5);
return 0;
}
返回結果:
3 | 5 = 7
0000 0011 | 0000 0101 = 0000 0111
**按位異或(^)**
按位異或(^)可以把數位上的內容做異或計算。
如果兩個數位內容一樣則異或計算結果是0, 否則結果是1。
/*
按位異或
*/
#include <stdio.h>
int main(){
printf("3 ^ 5 = %d\n", 3 ^ 5);
return 0;
}
返回結果:
3 ^ 5 = 6
0000 0011 ^ 0000 0101 = 0000 0110
**移位操作**
移位操作可以把一個數字中所有二進制數位的內容同意向左或向右移動n個位置。
* >> 表示向右移動
* << 表示向左移動
他們都是雙目位操作符。
操作符左邊的數字是將要進行移位操作的數字。
操作符右邊的數字是將要移動的位數。
/*
移位操作練習
*/
#include <stdio.h>
int main(){
printf("3 << 2 = %d\n", 3 << 2);
return 0;
}
返回結果:
3 << 2 = 12
0000 0011 << 2 = 0000 1100
向左移動的時候,右邊空出來的位置上一定填充0。
無符號類型數字向右移位后左邊空出來的位置上一定填充0。
有符號類型數字向右移位后左邊空出來的位置上填充符號位。
一般情況下數字向左移動n位相當于乘以2的n次方,向右移動n位相當于除以2的n次方。
位操作符不會修改任何存儲區內容,它們只是會計算出一個新數字。
### 地址相關操作符
**計算一個存儲區的地址**
&也可以作為單目操作符使用,這個時候它可以用來計算一個存儲區的地址。
這個操作符使用的時候,應該寫在一個存儲區的前面。
可以使用%p做占位符把地址數據顯示在屏幕上。
在我們的計算機上所有的地址數據都是32個二進制數位。
/*
地址相關操作符演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("&num = %p\n", &num);
return 0;
}
**知道對應的存儲區**
"*" 可以當做單目操作符使用,這個時候它可以根據一個地址找到對應的存儲區。
這個時候應該把它寫在一個地址數據前面。
/*
地址相關操作符演示
*/
#include <stdio.h>
int main(){
int num = 0;
*(&num) = 10;
printf("num = %d\n", num);
return 0;
}
### 三目操作符
操作符結構
布爾值 ? 公式一 : 公式二
如果布爾值是真就采用公式一進行計算,否則就采用公式二進行計算。
/*
三目表達式演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("請輸入一個數字:");
scanf("%d", &num);
num = num >= 0 ? num : 0 - num;
printf("絕對值是: %d\n", num);
return 0;
}
不要在問號后使用賦值操作符,會因為符號優先級問題,造成不正確的計算。