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

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

不知各位有木有想过,在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可以对任何基本类型进行初始化!我们下面看以下代码:

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 这种比较指令都不需要用。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/5189.html

(0)
上一篇 2022-12-13 20:40
下一篇 2022-12-13 20:40

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信