1. 描述普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
普通局部变量仅函数内有效,普通全局变量extern出去可以支持多个文件下的函数,静态局部变量作用域也是函数内部,但是静态变量只初始化一次。而且普通变量放在堆里面,静态变量放在BSS段或者方法区。
静态变量Static限制了变量的作用域只能是本文件,其他文件没有extern的话可以定义同名变量。静态成员是属于类的一部分,静态局部是属于方法的一部分。和类模板/方法共享存储区。
普通局部不初始化内容随机,普通全局、静态全局和静态局部不初始化都为0。
2. extern 解释
extern 用来声明一个变量在其他文件中定义了。通常写在头文件里规范代码。
3. C语言中有符号和无符号的区别
C语言里面有符号无符号一般就像int16、int32、uint16、uint32。
uint32一般是 stdint.h 里面定义的 typedef unsigned int 类型,uint16之类的就是unsigned int 但是只用了低16位。
4. 变量的声明与定义有啥区别
声明不为变量开辟空间,是对变量的类型和名称进行说明。
5. 描述变量的命名规则
字母数字下划线组成,不能以数字开头。
6. #include<> 与#include ""的区别?
尖括号表示系统路径,引号表示用户路径,没找到才去系统路径找。
7. 关键字 signed 和 unsigned 的区别
关键字 signed 表示符号数,可以省略,系统变量默认是 signed 类型
关键字 unsigned 表示无符号数
8. 32 位平台上char short int long float double 各自的字节数
char 8
short 16
int 32
long 32
float 32
double 64
9. 谈谈关键字 register
register修饰寄存器变量,cpu读取寄存器变量比读取一般变量要快。该关键字只是建议变量为寄存器变量,具体是不是由编译器决定。
10. 谈谈关键字sizeof
关键字sizeof一般拿来和函数lenth一起聊,一个是关键字一个是函数,一个是求变量所占字节数,一个是求字符数组的长度。要求一个数组长度的话,一般Sizeof数组名/sizeof数组第一个元素
11. 谈谈volatile关键字
volatile关键字禁止对变量的优化。
比如a=1,a=2,a=3,可能编译后的效果就只剩一个a=3。用volatile修饰后强制从内存取值而不是从缓存取值。
12. define 与 typedef
define 是宏定义,typedef 是为变量取别名。
define 是预处理指令,在编译前的预处理时期做处理。
typedef 是编译阶段起作用。
宏定义是简单的字符替换,不会走类型检查。typedef 在静态区分配空间,整个程序运行过程内存中只有一个拷贝。
前置后置++
前置++是先局部变量加了再入栈,后置++是先入栈用了再加。
防止头文件重复引用
#ifndef
#define
#endif
13. inline 函数
inline关键字告诉编译器将内联函数展开,而不是通过函数调用的方式执行。一般用来优化简单的函数加快执行速度。
inline是在编译器处理的,有类型检查。
函数非常小且调用频繁的情况下编译器会自动隐式内联。
14. 谈谈你对变量初始化的理解
在定义变量的时候给变量赋值,这个动作叫做变量初始化。局部变量不初始化内容随机,全局变量、静态局部和静态全局不初始化内容为默认0。良好的编程习惯要求手动初始化。
15. 谈谈 ' ' 和 “ ” 的作用
单引号的作用是描述一个字符,除了转义字符以外就是ascii码
双引号描述一个字符串,如果是字符串常量编译器会自动在结尾添加 \0。字符串数组时一般要注意。
16. 谈谈C语言自动类型转换的特点
不同数据类型之间混合运算就会涉及自动类型转换。
自动类型转换会保证精度不丢失,把小类型转换成大类型。
有符号和无符号,转换成无符号
小类型和大类型,转换成大类型
char 和 short,只要自动转换就会将自己转换成 int
17. 谈谈逻辑运算符&& 和 || 的理解
逻辑与和逻辑或
涉及短路,逻辑与左边的假了,右边的表达式就不会执行
逻辑或左边的真了,右边的表达式就不会执行
18. 谈谈运算符 &、|、^ 的应用场景
& 一般将指定位清零
| 一般将指定位置1
^ 一般将指定位翻转
19. 谈谈逻辑右移和算术右移的区别
算术右移是针对有符号数的,符号位保留,用符号位填充空的位置
逻辑右移是针对无符号数的,在左侧插入0,不考虑符号位。