C语言基础4

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或指针类型,编译器会报错。

断言宏的作用

断言宏通常用于在程序中插入一些检查语句,以确保程序的正确性和健壮性。其主要作用包括:

  1. 调试和测试:断言宏可以帮助开发人员在开发和测试阶段检查程序中的假设是否成立,及时发现潜在的问题和错误。

  2. 程序健壮性:通过断言宏可以在程序中加入一些前置条件和后置条件的检查,确保程序在运行时满足一定的条件,防止出现不可预料的错误。

  3. 错误定位:当断言条件不满足时,断言宏会触发断言失败,输出错误信息并中断程序执行,帮助开发人员快速定位问题所在。

  4. 提高代码质量:合理使用断言宏可以帮助开发人员编写更健壮、更可靠的代码,提高代码质量和可维护性。

一般来说,断言宏在开发和测试阶段经常被使用,一旦程序发布到生产环境中,通常会关闭断言功能,以提高程序的性能和稳定性。

在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体系,小端存储模式)

相关推荐
爱吃生蚝的于勒12 小时前
【Linux】线程概念(一)
java·linux·运维·服务器·开发语言·数据结构·vim
kong790692812 小时前
Nginx性能优化
java·nginx·性能优化
Pluchon12 小时前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法
我命由我1234512 小时前
Java 泛型 - Java 泛型通配符(上界通配符、下界通配符、无界通配符、PECS 原则)
java·开发语言·后端·java-ee·intellij-idea·idea·intellij idea
Seven9712 小时前
AQS深度探索:以ReentrantLock看Java并发编程的高效实现
java
yunsr12 小时前
python作业3
开发语言·python
4311媒体网12 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
淡忘_cx12 小时前
使用Jenkins自动化部署spring-java项目+宝塔重启项目命令(2.528.2版本)
java·自动化·jenkins
星火开发设计12 小时前
this 指针:指向对象自身的隐含指针
开发语言·数据结构·c++·学习·指针·知识
梵刹古音12 小时前
【C++】构造函数
开发语言·c++