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

相关推荐
消失的旧时光-19433 分钟前
从拷贝到移动:C++ 移动构造与移动赋值是怎么被逼出来的?(附完整示例)
开发语言·c++
古译汉书3 分钟前
部分.exe文件打开但是一直显示界面,点击任务栏持续无反应
开发语言·单片机·嵌入式硬件
码农阿豪7 分钟前
Oracle 到金仓数据库迁移实战:一次真正“落地”的国产替代之旅
java·数据库·oracle
2301_817497338 分钟前
C++中的装饰器模式高级应用
开发语言·c++·算法
m0_5494166612 分钟前
C++编译期字符串处理
开发语言·c++·算法
m0_5811241912 分钟前
C++中的适配器模式实战
开发语言·c++·算法
Coding茶水间18 分钟前
基于深度学习的狗品种检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
£漫步 云端彡26 分钟前
Golang学习历程【第十篇 方法(method)与接收者】
开发语言·学习·golang
小王不爱笑13227 分钟前
SpringBoot 整合 Ollama + 本地 DeepSeek 模型
java·spring boot·后端
毕设源码-钟学长28 分钟前
【开题答辩全过程】以 高校宿舍分配系统设计与实现为例,包含答辩的问题和答案
java