sizeof和strlen的区别
①sizeof是运算符而strlen是函数
②sizeof可以用类型做参数,strlen只能用char*做参数
③数组做sizeof参数不退化,而传递给strlen则退化成指针
④strlen结果是运行时候才能计算出来,而且计算出来的是字符串的长度不是内村的大小
⑤当使用的是结构体或者变量时,sizeof返回的是实际的大小,静态空间数组则返回数组的尺寸
⑥sizeof不能返回动态分配的数组或者外部数组的尺寸
volatile关键字的作用
通过volatile关键字告知编译器不要对变量进行优化,以避免出现意外的行为。更确切的是告诉优化器在用到这个变量时必须每次都小心地重新读取这个变量在内存中的值,而不是使用保存在寄存器里的备份(虽然读写寄存器比读写内存快)。
它主要用于处理与多线程、中断处理和硬件寄存器等相关的情况。
1、防止编译器优化:编译器在优化代码时会尝试将变量的访问操作优化为更高效的方式,例如将变量的值缓存在寄存器中。然而,对于某些特殊的变量,如多线程环境下的共享变量、中断处理中的标志位、硬件寄存器等,这种优化可能会导致意外的行为。使用 volatile 关键字可以告诉编译器不要对该变量进行优化,确保每次访问都从内存中读取或写入。
2、处理多线程共享变量:在多线程编程中,当一个变量被多个线程共享并且可能被一个线程修改时,需要使用 volatile 关键字来确保线程之间的可见性。这样可以防止编译器对共享变量的优化,确保每个线程都能正确地读取到最新的值。
3、处理中断和硬件寄存器:在中断处理程序中,某些变量可能由硬件直接修改,而不是通过常规的变量赋值操作。在这种情况下,使用 volatile 关键字可以确保编译器不会对这些变量的访问进行优化,以避免出现不一致的行为。
不能做switch的参数类型
switch语句的参数只能是整数类型,包括char、int以及enum类型。
如果尝试使用其他类型,如float、double或指针类型,编译器会报错。
断言宏的作用
断言宏通常用于在程序中插入一些检查语句,以确保程序的正确性和健壮性。其主要作用包括:
-
调试和测试:断言宏可以帮助开发人员在开发和测试阶段检查程序中的假设是否成立,及时发现潜在的问题和错误。
-
程序健壮性:通过断言宏可以在程序中加入一些前置条件和后置条件的检查,确保程序在运行时满足一定的条件,防止出现不可预料的错误。
-
错误定位:当断言条件不满足时,断言宏会触发断言失败,输出错误信息并中断程序执行,帮助开发人员快速定位问题所在。
-
提高代码质量:合理使用断言宏可以帮助开发人员编写更健壮、更可靠的代码,提高代码质量和可维护性。
一般来说,断言宏在开发和测试阶段经常被使用,一旦程序发布到生产环境中,通常会关闭断言功能,以提高程序的性能和稳定性。
在C/C++中,常用的断言宏包括 assert
宏,用于检查条件是否满足,如果条件不满足,则触发断言失败。
浮点类型的内存模型
以单精度浮点数(float)为例:
1、先将float值的整数位转换为二进制
2、再将其小数位转为二进制
3、左移小数点,保证整数位有且只有1个1(整数位不能为0)
4、按照内存模型进行存储
(1) 最高一位为符号位:正数为0, 负数为1
(2) 符号位后面的8位为指数位
规则:127+指数值,转换为二进制
(3) 剩余23位为尾数位
规则:尾数如果不足23位,则右侧补0(二进制小数位后面补零)
尾数如果超过23位,则只保留23位,其余舍去
5、将内存模型中的二进制转换为十六进制(调试期间,查看内存时的数据显示状态为十六位)
6、然后将其转换为小端存储模式(调试期间,通常系统都是X86体系,小端存储模式)