位操作符: 可以直接操作二進位數位的內容;~是一個單目位操作符,它可以根據一個數字計算另外一個數字,這兩個數字所有二進位數位的內容都不同(按位取反),使用的時候這個符號應該寫在數字前面 雙目位操作符:包括按位與(&),按位或(|)以及按位異或(^),他們都可以把兩個數字對應二進位數位的內容做計算。 ...
位操作符:
可以直接操作二進位數位的內容;~是一個單目位操作符,它可以根據一個數字計算另外一個數字,這兩個數字所有二進位數位的內容都不同(按位取反),使用的時候這個符號應該寫在數字前面
雙目位操作符:包括按位與(&),按位或(|)以及按位異或(^),他們都可以把兩個數字對應二進位數位的內容做計算。
按位與(&)
可以把兩個數字對應數位的內容做計算;只要一個數位的內容是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