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

相关推荐
li16709027013 分钟前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
We་ct30 分钟前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
身如柳絮随风扬37 分钟前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
skywalk816338 分钟前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
小书房41 分钟前
Kotlin的by
android·开发语言·kotlin·委托·by
就叫飞六吧1 小时前
QT写一个桌面程序exe并动态打包基本流程(c++)
开发语言·c++
threelab1 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
Java小生不才1 小时前
Spring AI文生音
java·人工智能·spring
凯尔萨厮1 小时前
Springboot2.x+Thymeleaf项目创建
java
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化