【摘要】
知識點包括:全局變量的二次賦值;計算轉化為二進制後,數字中 1 的數量;用一個非循環表達式判斷一個數是否是2的N次方;邏輯運算與位邏輯運算;printf 輸入表達式的執行順序;類型轉換中字符截斷與數值大小的關系;位運算兩個數值的取平均與求和;無判斷語句求取變量中較大存在;無中間量交換變量;C/C++關系。
【正文】
1. 賦值語句
考點:int i=i // 全局變量;
考點:與運算和按位與運算;
總結:== && ||屬於邏輯運算符,返回值為bool值
#includeusing namespace std; int i = 1; int main() { cout< 考點:計算轉化為二進制後,數字中 1 的數量。
int fun(int x) { int con = 0; while(x) { x = x&(x-1); con++; } return con; }
2. i++問題
考點:printf函數從右往左執行輸出數據;
考點:(++ptr) 該語句的下一語句才有 ptr = ptr+1;
#includevoid main() { int b = 3; int arr[] = {6,7,8,9,10}; sint *ptr = arr; *(ptr++) += 123; printf(%d , *(ptr-1)); //輸出129 printf(%d , *ptr); //輸出7 printf(%d,%d , *ptr, *(++ptr)); //輸出8,8 }
3、類型的轉換
考點:作用是因為浮點數在內存裡和整數的存儲方式不同,這相當於把該浮點數地址開始的sizeof(int)個字節當成int型的數據輸出,只有當a = 0時候,int a才會和int(&a)相同。
float a;
int(&a);
考點:unsigned char 與 char 位長;
考點:指針尋址;
#includeint main() { unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char *b = (char*)&a; unsigned char *c = (unsigned char*)&a; printf(%08x %08x %08x , i, *b, *c); int *p = 0; // ??? return 0; } 輸出結果
000000f7
總結:前者為unsigned int 變量賦值給unsigned char變量時,會發生字節的截斷,3位和高於3位的將會被程序自動丟棄;後者為將unsigned int 型指針轉化為一個char型的指針,這個影響的是指針的尋址。
fffffff7
000000f7
Press any key to continue
4、運算符的問題
考點:運算符的優先級;
考點:隱式類型轉換;
#includeusing namespace std; int main() { unsigned char a = 0xA5; unsigned char b = ~a>>4+1; printf(b=%d , b); return 0; }
運行結果為250.
總結:C/C++運算符優先級口訣 ! ~ ++ -- & + - >> << == != ^ | && || ?:
詳見:C 語言運算符優先級(記憶口訣)
詳址:http://blog.csdn.net/u013630349/article/details/47444939
首先將a和4的值轉換為 int 型,即所為整數提升,再進行後續的運算。可以知道+優先級別比>>要高,所以,先計算4+1故可以知道先取a反之後在右移5位。得到結果後,將數值轉換為 unsigned char ,再賦給 b。
這裡還有一個特別容易錯的地方,我們不能將0xA5轉化為1010 0101我們應該寫成16進制,之後因為unsigned char只能表示低8位的數值,所以為250。
考點:判斷一個數是不是 2 的 N 次 冪
!(X & (X-1))
用一個非循環表達式判斷一個數是否是2的N次方,2^N即為二進制的10,100,1000 ...
故,表達式為 0 ,則判斷為是2的N次冪。
考點:用一個表達式取兩個數的平均值
return((x & y) + (x ^ y) >> 1)
x&y取相同的位與,相當於相同位置保留且折半;(x^y) >> 1取x和y的非進位加法,右移相當於折半,之後取平均。
考點:利用位運算實現兩個整數的加法運算
int Add(int a,int b) { if(b == 0) return a;//沒有進位 int sum, carry; sum = a ^ b; //完成沒有進位的加法運算 carry = (a & b) << 1; //完成進位並且左移運算 return Add(sum. carry); //遞歸相加 }
5、a、b交換與比較
考點:不使用判斷與選擇語句,找出兩個數中比較大。
int max = ((a+b) + abs(a-b))/2;
考點:無中間變量,交換a、b。
a = a ^ b;//用異或語句
b = a ^ b;
a = a ^ b;
6、C和C++的關系
1)在C++程序中調用被C編譯器編譯後的函數,為什麼要加extern C?
C++語言支持函數重載,C語言不支持,假設某個函數的原型為void foo(int x,int y)該函數被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字,作用解決名字匹配的問題。
2)C語言是一種結構化語言,重點在於算法和數據結構,C程序的設計首先要考慮的是如何通過一個過程對輸入進行運算處理得到輸出;而對於C++首先要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對於的問題域,通過獲取對象的狀態信息得到輸出或實現過程的控制。