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)