C语言中万能又神奇的数字——0

不知各位有木有想过,在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就表明为空字符'')。这不单单适用于ASCII码,其他编码格式均遵循这一规则。这也使得我们判定任何一种编码格式的字符串是否结束,均能用0来进行判读~
  • 作为指针值:0表明为空指针NULL)。C语言中一般把 NULL 定义为 (void*)0;而C++中一般直接定义为 0
  • 而在C++中,对一个类成员虚函数的声明后面赋值为0,表明将该虚函数为纯虚函数。

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

C语言中万能又神奇的数字——0

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

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

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

C语言中万能又神奇的数字——0

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

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

C语言中万能又神奇的数字——0

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

其他常用的库对0的定义

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

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
羊又走丢了的头像 - 鹿快
评论 共4条

请登录后发表评论