不知各位有木有想过,在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 这种比较指令都不需要用。
中国大陆
美国
日本
韩国
新加坡
英国
德国
BVI
开曼
澳大利亚
加拿大
中国澳门
中国台湾
印度
法国
西班牙
意大利
马来西亚
泰国
荷兰
瑞士
阿联酋
沙特阿拉伯
以色列
新西兰
墨西哥
巴西
阿根廷
尼日利亚
南非
埃及
哥伦比亚
智利
秘鲁
乌拉圭
比利时
瑞典
芬兰
葡萄牙
加纳
肯尼亚
摩洛哥
斐济
萨摩亚
巴哈马
巴巴多斯
哥斯达黎加
毛里求斯
塞舌尔
百慕大
巴拿马
伯利兹
安圭拉
马绍尔
厄瓜多尔
记账报税
税务筹划
一般纳税人申请
小规模纳税人申请
进出口退税
离岸开户
商标注册
专利申请
著作权登记
公证认证
电商入驻
网站建设
VAT注册
ODI跨境投资备案
许可证办理
体系认证
企业信用
高新技术企业认定
