不知各位有木有想过,在C语言以及C 编程语言中我们最常用的数是啥?据本人不完全统计,“0”这个数字是首当其冲的[呲牙]。下面我们先来看看,在C语言中0能用来表示啥~

if(100) { } // 这里相当于:if(100 != 0) { },因此条件为真 if(0.5) { } // 这里相当于:if(0.5 != 0) { },因此条件为真 if(NULL) { } // 这里相当于:if(NULL != 0) { },因此条件为假

因此 0 在C语言中可被表示为任何一种基本类型。它是名副其实的“百搭”~[偷笑]当然,这也得感谢于其他一些标准(比如IEEE754规格化浮点数标准对0表示的定义)对0赋予了非常统一的语义。因此,不光光是在C语言中,而且在其他大部分主流编程语言中,0 在数值上表示为0,对于布尔值表示为,对于字符表示为空字符、对于指针(或引用)表示为空指针!这意味着什么呢?0可以对任何基本类型进行初始化!我们下面看以下代码:

c语言比较小的数字(C语言中万能又神奇的数字)(1)

对结构体对象初始化为全零

有了上面对0的认识,那我们下面来举一个例子,如何利用0来快速对一个结构体对象对其所有成员初始化为0。

通常古老的做法是声明一个结构体对象,然后调用 memset 将其成员清空。而从C99开始,我们可以用初始化器将其成员轻松清0,代码干净整洁,而且编译器还能方便通过使用SIMD指令优化清零操作。我们看以下代码:

c语言比较小的数字(C语言中万能又神奇的数字)(2)

上述代码中,假如我们使用了GNU语法扩展(比如指定了-std=gnu99或-std=gnu11),那么 { 0 } 可直接用 { } 表示,里面的0可省。

下面我们来检验一下,上述代码中的objS和objT的每个成员是否真的都为0了。

c语言比较小的数字(C语言中万能又神奇的数字)(3)

通过调试器我们可以简洁又清楚地看到,objS和objT这两个对象的所有成员确实被清零了。是不是非常方便?[憨笑]

其他常用的库对0的定义

我们在写代码时常常会将 0 作为一个无效值进行处理。而不少开源库以及其他一些标准库常常会将 0 作为“返回正常值”的错误码。比如,OpenCL中表示成功状态码的 CL_SUCCESS 就被定义为0;Vulkan API中表示成功状态码的 VK_SUCCESS 也被定义为0;还有CUDA中表示成功状态码的 cudaSuccess 也被定义为0。因为与0进行比较对于主流处理器而言非常方便灵活,有时候可优化为直接对计算结果做ZF标志位的判定即可,连 CMP TEST 这种比较指令都不需要用。

,