1.在位運算和邏輯運算中,我們要知道,當某個變量進行位運算之後,該變量本身不會被修改,只有當該變量被再次賦值之後,該變量的值才會改變,有符號數的移位補的是符號位。對於邏輯運算的短路性大家可以看看下面的實例。
#include <stdio.h>
int main()
{
int a = 7,b= 9,c = 0;
//邏輯與&& 的短路特性
printf("a > b && c++ : %d\n",a > b &&c++);
printf("c = %d\n",c);
//邏輯或 || 的短路特性
printf("===========================\n");
printf("a < b || c++ : %d\n",a < b || c++);
printf("c = %d\n",c);
return 0;
}
打印出:
由此可知,邏輯與&&的短路性是只要符號前面一個表達式結果為假則整個表達式為假,即“一假都假”,不用考慮後面的式子;邏輯或 || 的短路性是只要前面的式子為真,則整個式子都是真,即“一真都真”,不管後面的式子。
對於移位操作,我們要知道,二進制左移相當於乘以二,右移相當於除以二,
那麼,如果我想將寄存器reg的第15~12位置為0101,該怎麼做呢?設reg原來的值為0xffff 7fff,那麼置位後,將變成0xffff5fff大家看看下面的代碼。
#include <stdio.h>
int main()
{
unsigned intreg = 0xffff7fff;
//讀,改,寫
//將reg 第15位置1,從0開始數
reg = reg |(1 << 15);
printf("reg = %#x\n",reg);
//將reg 第13位清0,從0開始數
reg = reg& ~(1 << 13);
printf("reg = %#x\n",reg);
//先將操作幾位全清0,再寫入指位上的1
//將reg 第15 ~ 12 位置為0101,
reg = reg& ~(15 << 12) | (5 << 12);
printf("reg = %#x\n",reg);
return 0;
}
打印出:
實際上,在ARM的單板操作中,經常用到移位操作,由此得出,在批量控制位時,我們可以先將控制位清零,再寫控制位,在清零的時候,用移位操作。注意:移位操作只能用在整數之間。
現在,我們想一下,如果我們想不引入第三個變量,實現兩個數據的交換,有幾種做法?這裡給出三種做法:
# include <stdio.h>
int main()
{
int a,b;
printf("請輸入a和b的值:");
scanf("%d%d",&a,&b);
printf("a =%d, b = %d\n",a,b);
//a += b;
//b -= b;
//a -= b;
a =a+b-(b=a);
//a ^= b;
//b ^= b;
//a ^= b;
printf("a =%d, b = %d\n",a,b);
return 0;
}
打印的結果為:
程序比較簡單,大家自行分析。
2.大家先看看這個代碼:
# include <stdio.h>
int main()
{
int c =0;
int d = 0;
d =getchar();
//c = getchar();
printf(“d= %c : %d\n”,d,d);
printf(“c= %c : %d\n”,d,d);
return 0;
}
大家都知道,這個代碼打印的是:
那如果我把注釋的那行c= getchar();啟用呢?結果又是什麼呢?實際上,它打印出:
只允許我們輸入一個字符,回車後,就直接打印了。大家會發現,c在回車之後直接給出了10,這個10是怎麼來的呢?細心的朋友也許會發現,10正好是“\n”的ASCII碼,我們可以直接在命令行中輸入:man ascii即可調出ASCII碼表:
可以看到“\n“的ASCII碼正好是10,程序中,直接將回車鍵當做成了一個字符,所以c實際上賦值的是”\n“,我們要知道,在windows下是區分ASCII碼文件和二進制文件的,對回車鍵的處理不一樣,ASCII文件輸入回車時,將其轉化為\r和\n兩個字符,輸出時,又轉化回來,二進制文件不做轉化。而在linux下則不區分什麼ASCII碼文件和二進制文件,直接當作”\n“處理。
3.對於下面這個實例,我想得出的結果,大家會大吃一驚:
# include <head.h>
int main(int argc, const char *argv[])
{
printf("Hello World!\n");
printf("Welcome To Linux!\t");
//printf("Welcome To Linux!\n");
sleep(3);
printf("Test!!!\t");
return 0;
}
打印的結果是:
先打印出Hello World!然後等待3秒鐘之後打印剩下的語句,為什麼會這樣呢?我們發現,這些輸出語句的唯一區別是後面的格式符不一樣,到底“\n“和”\t”有什麼區別?其實,”\n”的作用之一刷新緩存,即將鍵盤中的緩存輸出,所以有打印輸出,而”\t“和其他格式符則沒有。但是,還有一點要注意,在程序執行結束也會刷新緩存,所以就有了上面的那種現象!大家可以把中間的printf(“Welcome To Linux!\t”);換成”\n”就會發現直接打印前兩句,等3秒之後,打印最後一句!
4.最後給一個比較糾結的例子,大家先看看打印結果是什麼?為什麼會是這個?思考一下程序的執行過程。
#include <stdio.h>
int main()
{
unsignedint a = 10;
int b = -30;
if(a < b)
{
printf("a < b\n");
}
else
{
printf("a > b\n");
}
/*if(sizeof(char)- sizeof(int) > 0)*/
if(sizeof(char) > sizeof(int))
{
printf("sizeof(char) > sizeof(int)\n");
}
else
{
printf("sizeof(char) <= sizeof(int)\n");
}
return 0;
}
打印:
下次再給解釋!
本文出自 “嵌入式學習之路” 博客,請務必保留此出處http://fancong.blog.51cto.com/3191877/1290982