不知各位有木有想过,在C语言以及C++编程语言中我们最常用的数是啥?据本人不完全统计,“0”这个数字是首当其冲的。下面我们先来看看,在C语言中0能用来表示啥~
作为整数:0就是数值为0的整数。作为浮点数:0就是数值为 +0.0 的规格化浮点数表示。(-0.0表示为最高位的符号位为1,其余位为0。比如 -0.0 的32位单精度浮点数的规格化表示为0x8000'0000。)作为关系表达式的值:0就是假(false);非零(通常指定为1)为真(true)。C语言中原本没有引入布尔类型,因此任何一个可被转换为一个关系表达式的表达式(比如整数表达式),均可用跟0比较来获取最终关系表达式的结果值。比如:
if(100) { } // 这里相当于:if(100 !=0) { },因此条件为真
if(0.5) { } // 这里相当于:if(0.5 !=0) { },因此条件为真
if(NULL) { } // 这里相当于:if(NULL !=0) { },因此条件为假作为字符:0就表示为空字符('\0')。这不单单适用于ASCII码,其他编码格式均遵循这一规则。这也使得我们判定任何一种编码格式的字符串是否结束,均能用0来进行判读~作为指针值:0表示为空指针(NULL)。C语言中通常把 NULL 定义为 (void*)0;而C++中通常直接定义为 0。而在C++中,对一个类成员虚函数的声明后面赋值为0,表示将该虚函数为纯虚函数。
因此 0 在C语言中可被表示为任何一种基本类型。它是名副其实的“百搭”~当然,这也得感谢于其他一些标准(比如IEEE754规格化浮点数标准对0表示的定义)对0赋予了非常统一的语义。因此,不光光是在C语言中,而且在其他大部分主流编程语言中,0 在数值上表示为0,对于布尔值表示为假,对于字符表示为空字符、对于指针(或引用)表示为空指针!这意味着什么呢?0可以对任何基本类型进行初始化!我们下面看以下代码:
对结构体对象初始化为全零
有了上面对0的认识,那我们下面来举一个例子,如何利用0来快速对一个结构体对象对其所有成员初始化为0。
通常古老的做法是声明一个结构体对象,然后调用 memset 将其成员清空。而从C99开始,我们可以用初始化器将其成员轻松清0,代码干净整洁,而且编译器还能方便通过使用SIMD指令优化清零操作。我们看以下代码:
上述代码中,假如我们使用了GNU语法扩展(比如指定了-std=gnu99或-std=gnu11),那么 { 0 } 可直接用 { } 表示,里面的0可省。
下面我们来检验一下,上述代码中的objS和objT的每个成员是否真的都为0了。
通过调试器我们可以简洁又清楚地看到,objS和objT这两个对象的所有成员确实被清零了。是不是非常方便?
其他常用的库对0的定义
我们在写代码时常常会将 0 作为一个无效值进行处理。而不少开源库以及其他一些标准库常常会将 0 作为“返回正常值”的错误码。比如,OpenCL中表示成功状态码的 CL_SUCCESS 就被定义为0;Vulkan API中表示成功状态码的 VK_SUCCESS 也被定义为0;还有CUDA中表示成功状态码的 cudaSuccess 也被定义为0。因为与0进行比较对于主流处理器而言非常方便灵活,有时候可优化为直接对计算结果做ZF标志位的判定即可,连 CMP 或 TEST 这种比较指令都不需要用。
版权声明:本文来自互联网整理发布,如有侵权,联系删除
原文链接:https://www.yigezhs.comhttps://www.yigezhs.com/tiyuzhishi/4904.html