位運算子:
可以直接操作二進位制數位的內容;~是一個單目位運算子,它可以根據一個數字計算另外一個數字,這兩個數字所有二進位制數位的內容都不同(按位取反),使用的時候這個符號應該寫在數字前面
雙目位運算子:包括按位與(&),按位或(|)以及按位異或(^),他們都可以把兩個數字對應二進位制數位的內容做計算。
按位與(&)
可以把兩個數字對應數位的內容做計算;只要一個數位的內容是0則與計算以後的結果就是0
3 0000 0011
& 5 0000 0101
0000 0001
任何數位內容和0做按位與結果一定是0,任何數位內容和1做按位與結果保持不變,按位與可以用來獲得某些數位的內容,按位與還可以把某些數位的內容設定成0.
按位或(|)
可以把兩個數字對應數位的內容做或計算;只要一個數為的內容是1則或計算以後結果就是1
3 0000 0011
| 5 0000 0101
0000 0111
任何數位內容和0做按位或結果保持不變;任何數位內容和1做按位或結果就是1,按位或可以把某些數位的內容設定成1
按位異或(^)
可以把兩個數字的對應數位內容做異或計算,如果兩個數位內容一樣則異或結果是0,否則結果是1
3 0000 0011
^ 5 0000 0101
0000 0110
任何數位內容和0做按位異或保持不變;任何數位內容和1做按位異或一定改變,按位異或可以把某些數位的內容變成相反內容
'a' 97 0110 0001
'A' 65 0100 0001
ch &=32;
ch |=32;
ch ^=32;
移位運算子
可以把一個數字裡所有二進位制數位的內容統一向左或向右移動n個位置
'>>'表示向右移位
'<<'表示向左移位;
他們都是雙目位運算子,運算子左邊是將要進行移位操作的數字,運算子右邊是將要移動的數位,移位操作本質上就是把每個數位的內容放到另外一個數位裡,向左移位的時候右邊空出來的數位裡必須填充0,無符號型別數字右移的時候左邊空出來的數位裡填充0;有符號型別數字右移的時候左邊空出來的數位裡填充符號位的內容(1或0)。一般情況下向左移動n個位置相當於乘以2的n次方,向右移動n個位置相當於除以2的n次方。所有位運算子都不會修改儲存區內容。
&也可以作為單目運算子使用,這個時候它可以用來計算一個儲存區的地址;使用的時候應該把這個運算子寫在一個儲存區的前面,可以使用%p佔位符把地址資料顯示在終端視窗裡。我們的計算機裡所有地址資料都是由32個二進位制數位構成的。
*也可以作為單目運算子使用,這個時候它可以根據一個地址找到對應的儲存區,這個運算子應該寫在一個地址資料前面。
三目運算子
可以從兩套計算規則裡選擇一套進行計算,三目運算子格式如下:
布林值 ? 公式1:公式2;如果布林值為真就採用公式1計算,否則就採用公式2計算。不要再?後使用賦值運算子
練習:男人身高減體重小於105算超重,女人身高減體重小於110算超重;gender(0代表女人,1代表男人),height 身高,weight 體重。使用三目表示式。
gender ? height-weight<105:height-weight<110
練習:編寫程式從鍵盤得到一個0到127之間的整數,把這個整數轉換成二進位制的結果顯示在螢幕上
隱式型別轉換
如果表示式裡包含多個不同型別的數字就必須首先把他們轉換成同一個型別然後在計算,這個轉換過程叫隱式型別轉換,隱式型別轉換完全由計算機完成,隱式型別轉換的時候必須把佔地小的型別轉換成佔地大的型別,如果不同型別數字大小不一樣就把整數型別轉換成單精度浮點型別,把有符號型別轉換成無符號型別。
強制型別轉換
C語言程式裡可以臨時給數字指定型別,這叫做強制型別轉換,強制型別轉換格式如下
(char)300
強制型別轉換有可能導致資料內容丟失,型別轉換不會修改儲存區內容
分支語句
分支語句可以從幾組語句中選擇一組執行而忽略其他組,如果在編寫程式的時候遇到多種可能性,每種可能性需要專門的語句處理就需要使用分支;if關鍵字可以用來編寫分支語句,if分支裡需要為每種可能性編寫專門的語句進行處理,if分支裡需要為每組語句編寫配對的邏輯表示式,當某個邏輯表示式結果為真的時候就執行它配對的那一組語句。
if(){
}
else if(){
}
else if(){
}
else if(){
}
if分支裡的任何兩組語句都不可能同時執行(可能同時執行的語句不可以被包含在一個if分支裡),編寫if分支的時候最好先把所有可能性的個數確定下來,如果分支裡必然有一組語句會執行就可以省略最後一組語句的邏輯表示式和if關鍵字如果if分支裡多個邏輯表示式同時為真就執行第一個為真的邏輯表示式所對應的語句而忽略後面的語句,可以利用這一點簡化if分支裡的邏輯表示式。if分支裡的某一組語句不僅僅和他配對的邏輯表示式有關,只有當前面的所有的邏輯表示式都為假而配對邏輯表示式為真的時候才會執行這組語句。編寫if分支的時候儘量把邏輯表示式簡單的寫在前面。
練習:編寫程式從鍵盤得到三個數字,找到其中最小的數字並把它顯示到螢幕上
switch……case格式也可以用來編寫分支,如果一個分支裡每個可能性都可以用一個唯一的整數表示,這種分支才可以用switch……case格式實現,
switch () {
case 0:
break;
case 1:
break;
case 2:
break;
case 4:
break;
default:
}
練習答案:
點選檢視程式碼
#if 0
/*
*
* 運算子演示
*
* */
#include<stdio.h>
int main(){
char ch=~0x92;
int num=ch;
printf("num=0x%x\n",num);
printf("3&5=%d\n",3&5);
printf("3|5=%d\n",3|5);
printf("3^5=%d\n",3^5);
printf("3<<2=%d\n",3<<2);
num=0x80000000;
printf("0x80000000>>2=0x%x\n",0x80000000 >> 2);
printf("num=0x%x\n",num >> 2);
return 0;
}
#elif 0
/*
*
* 地址相關運算子演示
*
*
* */
#include<stdio.h>
int main(){
int num=0;
printf("&num=%p\n",&num);
*(&num)=10;
printf("num=%d\n",num);
return 0;
}
#elif 0
/*
*
* 三目表示式演示、
*
*/
#include<stdio.h>
int main(){
int num=0;
printf("請輸入一個數字:\n");
scanf("%d",&num);
num=num >= 0 ? num : 0-num;
printf("絕對值是%d\n",num);
return 0;
}
#elif 0
/*
* 顯示從0到127之間的 整數,顯示二進位制
*
* */
#include<stdio.h>
int main(){
int num=0;
unsigned char tmp=0x80;
printf("請輸入數字0-127:\n");
scanf("%d",&num);
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf(" %d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
printf("\n");
return 0;
}
#elif 0
/*
*
* 型別轉換演示
*
* */
#include<stdio.h>
int main(){
printf("num=%d\n",sizeof(1 ? 1: 0.9));
printf("num1=%d\n",-7+3<0);
printf("num2=%d\n",-7+3u<0);
printf("%d %d\n",300,(char)300);
return 0;
}
#elif 0
/*
*
*if 分支語句演示
*
* */
#include<stdio.h>
int main(){
int num = 0;
printf("請輸入一個數字:\n");
scanf("%d",&num);
if(num > 0){
printf("非負數\n");
}
else if(num<0){
printf("負數\n");
}
else if(!num){
printf("是0\n");
}
return 0;
}
#elif 0
/*
*
* if分支演示
*
* */
#include<stdio.h>
int main(){
int num = 0;
printf("請輸入一個數字:\n");
scanf("%d",&num);
if (num < 0) {
printf("負數\n");
}
else if (num >= 0 && (num & 1)) {
printf("奇數\n");
}
else if (num >= 0 && !(num & 1)) {
printf("偶數\n");
}
return 0;
}
#elif 1
/*
*
* 尋找最小數字
*
* */
#include<stdio.h>
int main(){
int num1=0,num2=0,num3=0;
printf("請輸入三個數字:\n");
scanf("%d%d%d",&num1,&num2,&num3);
/*if (num2 > num1 && num3 > num1 ) {
printf("最小數字是:%d\n",num1);
}
else if (num1 > num2 && num3 >num2) {
printf("最小數字是:%d\n",num2);
}
else if (num1 > num3 && num2 > num3) {
printf("最小數字是:%d\n",num3);
}*/
if (num1 > num2) {
if (num2 > num3) {
printf("最小數字是是%d\n",num3);
}
else {
printf("最小數字是%d\n",num2);
}
}
else{
if (num1>num3) {
printf("最小數字是%d\n",num3);
}
else {
printf("最小數字是%d\n",num1);
}
}
return 0;
}
#endif