C/C++復習筆記(1)
這是一篇針對學習《程序員面試寶典》過程中的筆記,這本書的質量先不去考量,他其中確實涉及了不少雖然編程過程中一般用不到但確實是有必要註意的東西,而且又是各個企業的歷史真題,總有值得學習的東西。
也算臨時抱佛腳吧(`?ω?′)
內容可能會比較雜,排版可能也會比較亂
MarkDown導出,有的地方會有一點點亂
雜+CH5
先序遍歷
根左右
字符數組/整形數組初始化:
char a[4] = { ‘\0‘ };
int b[4] = { 0 };
結構體相關的:
ListNode * tmp = (ListNode *)malloc(sizeof(ListNode));
訪問成員時(*tmp).m_key
tmp->m_key
等價
強轉
(int &)a
與*((int *)&a)
等價
int a = 3; //整型變量a
int * b = 4; //b中存放的是一個地址,這個地址指向一個整型變量
int &c = a; //c是引用,其實也就是a的一個別名,引用要在聲明的同時初始化,並且不能修改
其實也就是將a
轉換成整形變量的地址,輸出的時候由於整型和其他類型如float
不一樣,輸出的內容也就不一樣了
指針
int * p = 0;
int * p = NULL;
等價
int * p = 1; //這是錯的
還有
int a = 5;
int *p = &a;
這個竟然還糾結了一下,基本功不夠紮實
枚舉
enum eN { a,b,c };
eN aa = a;
eN bb = eN::b;
兩種方法都是可以的,第二個的話可能更清晰一些吧我覺得
啦啦
char
和short
在運算前會轉換成int
具體的問題我給忘了
有符號數無符號數
unsigned int a = 0xFFFFFFFF; //是可以的,而且轉成十進制也正確
int b = 0xFFFFFFFF; //不是說不可以,只不過對有符號數來說,正數最大到0x7FFFFFFF,
//再大的就是負數了。會和想象不太符合,具體的轉換啥的也有必要再看看,不過暫時放一放
//嗯,取反加一s
小端儲存
對於跨子節的數據,低字節放在低地址,高字節放在高地址
對0x12345678
,放在這樣四個內存單元中,0x0000000
,0x00000001
,0x00000002
,0x00000003
,那麽0x00000000
中存放0x78
,0x00000003
中存放0x12
於是想順手分析一下這個題
#include<stdio.h>
int main(){
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char *b = (char *)&a;
printf("%08x, %08x", i, b);
}
char
型是一個字節,強轉之後有截斷,截斷舍棄高字節,也就是從低字節開始保留,於是unsigned int a = 0xFFFFFFF7;
,截斷後剩下unsigned char i = 0x000000F7
。
然後是下一行,將a
的地址轉換成char
型地址,高三個字節被舍棄,但*b
是有符號的,而且此時截斷完以後的數據首位是1,也就是符號位是1,於是根據符號位擴張,前面的那24位用1填充,於是輸出的就是0xFFFFFFF7
。
整型提升
計算前會把數提升到至少整型再計算,包括~
unsigned a = 0xA5;
unsigned b = ~a>>4+1;
a = 1010 0101
,計算前轉為整型的話就是0000 0000 1010 0101
,優先級上的話,~
>+
>>>
,於是就是1111 1111 0101 1010>>5
然後再截取,也就是1111 1010
也就是250。
運算符的優先級
優先級 | 運算符 | 例子 | 結合順序 | ||
---|---|---|---|---|---|
1 | () [] -> . :: ++ — | -> | |||
2 | ! ~ ++ — - + * & (type) sizeof | <- | |||
3 | -> . | -> | |||
4 | * / % | -> | |||
5 | + - | -> | |||
6 | << >> | -> | |||
7 | < <= > >= | -> | |||
8 | == != | -> | |||
9 | & | -> | |||
10 | ^ | -> | |||
11 | \ | -> | |||
12 | && | -> | |||
13 | \ | \ | -> | ||
14 | ?: | <- | |||
15 | = += -= *= /= %= &= ^= \ | = >>= <<= | <- | ||
16 | , | -> |
運算符問題 面試例題3
(x&y) + (x^y)>>1
x&y
是取與,也就是兩個數相同的位,仔細思考一下,實際上兩個相同的位最後只拿了一個,也就是說,相當於除以2了,後面((x^y)>>1)
的右移也是除以2,不過後面的是兩個數不同的位,還是有一點點厲害的!!
講道理,面試真給了這題……能做出來的幾率有點可憐,擦!
下面的那個例題是一個意思,位運算做和,那也就是(x&y)<<1 + (x^y)
C/C++復習筆記(1)