首页 > 常识 >

c语言中o代表什么(C语言中万能又神奇的数字——0)

更新时间:2024-09-13 09:50:16


  • 作为整数: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 这种比较指令都不需要用。