C语言关键字浅析-_Bool

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

_Bool关键字看上去并不像C语言其他常见的关键字,更像是个变量名

这样的下划线开头的关键字在C语言有三个:_Bool、_Complex、_Imaginary

如果你清楚C或C++语言的bool类型,看到_Bool可能会第一时间联想到bool类型,实际上它们也差不多

 

_Bool的作用是:

声明布尔变量。

 

1、_Bool的使用

与定义变量的类型关键字一样,_Bool以下面这种方式定义布尔变量:

/* 负责输入值的语句 */
int i;
_Bool input_over;   /* 布尔变量名可以取得顾名思义一些 */
input_over = scanf("%d", &i);
while (!input_over)
{
	printf("Error, input again:");
	scanf("%d", &i);
}

一般的,一个_Bool变量只能有两个值——1/0,分别表示真/假,如果把它赋值为另一个非零值,则变量还是被赋值为1

所以对于_Bool类型,任何非零值在逻辑表达式中都被认为是“真”,只有0表示“假”

 

2、_Bool、BOOL、bool傻傻分不清

虽然从作用上看,三者都可以表示布尔类型,不过他们还是有着自己的故事,甚至本质的区别

(1)BOOL

生在上世纪后半叶,并且从事计算机科学的话,你就会知道,那时候的C语言中没有bool这样的类型。那如何表示这种布尔关系呢?

微软说,不是还有typedef吗,故其自作主张,定义了BOOL这种类型,不过它的实质其实是:

typedef int BOOL;

也就是说,BOOL类型其实是一个int类型,所以它占用的内存放在32位int的机器中是4byte,这其实比后来的bool要大很多倍

现在编写C程序的时候BOOL可能用的不太多,如果还需要使用BOOL,可以记住它原本的自定义,自己加在程序中,或者引用包

不过现在写布尔类型一般都用_Bool和bool了

(2)bool

其实在C99之前,C语言没有bool类型这个说法,对于C语言,bool类型相当于舶来语、外来客

这是一段尘封的历史:一个关键的结点就是1992年,Microsoft Visual C++ 1.0推出,在这之前,微软使用自定义的BOOL类型表示布尔变量,布尔变量的bool其实是来源于英国数学家乔治·布尔(George Boole)。

92年之前,那时候C的“布尔类型”都是用整数类型表示,但C++的推出,出现了bool类型的定义,注意bool类型在C++的标准中从最初开始就一直有。而作为C的扩展的C++中有了bool的定义,C自己当时却仍然没有对布尔类型的定义,于是在C99标准中,新增了_Bool类型,其本质和用法与C++的bool是类似的。

不过需要注意的是,目前的C语言版本中仍然只支持_Bool不支持bool,C++中也不一定支持_Bool而都使用bool,这也算是二者的一个区别。其联系在于,用法差不多,本质也类似,都只占用1byte内存。其实原理上来说1bit就能表示真假,不过C语言中非零值都表示真,0表示假,1byte的内存允许用户用其他非零值表示真,可能会带来某些程序实现上的便利。

(3)_Bool

也就是说,C语言见其后起之秀C++中一开始就有了bool类型的定义,而自己仍然在使用整型表示布尔关系,不服气

一气之下在C99中新增了_Bool类型,而且看上去和bool不一样,有点我行我素的意味在里面,不过C++的bool确实比C的_Bool出现的早

 

3、C语言标准的发展史

1978年,国内正值改革开放,而大洋对岸也发生了一件计算机行业内比较轰动的事——K&R C标准出现

K&R其实是两位大神,Brian Kernighan和Dennis Ritchie的简称,后者对于程序员再熟悉不过了,即丹尼斯·里奇,C语言和UNIX之父

二位合作发行了一本书——《The C Programming Language》的第一版,该书最有意义的部分在于末尾的参考指南

别小看这份参考指南,它给出了一份当时C语言的完整定义,这被认为是C语言出现后的第一项C标准,被称为K&R C

随后C语言迎来了第一春,跑在了很多的各类机型上,C程序软件也一时风靡,受到了广泛支持

逐渐的,由于C的广泛应用和各种人们新增的特性被写到了各类编译器中,考虑到保证C的良好移植性,业内渴求一份新的更全面的C标准

于是乎,1983年,ANSI(美国国家标准协会)开始组织部门研究C语言的新标准,该标准于1989年被ANSI通过,称为C89或者ANSI C

至此,C语言有了国家级的标准,而国界不是阻拦C语言漂洋过海发展的拦路虎,C语言的更广泛应用不能缺少国际标准的制定

ANSI C通过后,《The C Programming Language》的第二版也根据C89开始编撰和发行,C89在技术上相比K&R C完善了很多

次年,1990年,在ISO(国际标准化组织)的努力下,通过了ANSI C成为国际标准,即ANSI C成为了ISO C

二者在标准文档上有细微区别,但技术上没有改变,所以ISO/ANSI C从技术上说是一样的

随后ISO还是对ISO C的文档继续做了一些功课,完善了很多文字上的细节问题,扩充了点文档(毕竟作为标准,文档要认真下功夫)

在1995年又发布了扩充后的ISO C标准,史称C95

离目前最关键的一次标准制定是1999年发生的,ISO/ANSI根据时代的变化在技术上加了一些东西,包括_Bool等一些关键字的新增,一些技术上的改动,为用户在技术层面提供了更好的便利性,这就是目前还在遵循的C99标准,是至今2018年最权威和最新的C标准。

_Bool、_Complex、_Imaginary就是C99新增的三种基本数据类型

 

——参考《C Primer Plus第五版》

 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现思路: 1. 定义一个结构体,用来存储C语言关键字的中英文翻译对应关系。 2. 读取用户输入的C语言关键字。 3. 在结构体中查找对应的中英文翻译,输出结果。 代码实现: ```c #include <stdio.h> #include <string.h> // 定义结构体存储中英文翻译对应关系 struct keywords { char cn[20]; char en[20]; } keywords[] = { {"自动", "auto"}, {"双精度", "double"}, {"枚举", "enum"}, {"浮点", "float"}, {"整型", "int"}, {"长整型", "long"}, {"短整型", "short"}, {"有符号", "signed"}, {"无符号", "unsigned"}, {"结构体", "struct"}, {"联合", "union"}, {"空类型", "void"}, {"布尔类型", "bool"}, {"字符类型", "char"}, {"常量", "const"}, {"指针", "pointer"}, {"函数", "function"}, {"返回值", "return"}, {"大小", "sizeOf"}, {"静态", "static"} }; int main() { char input[20]; printf("请输入C语言关键字:"); scanf("%s", input); int i; for (i = 0; i < sizeof(keywords) / sizeof(struct keywords); i++) { if (strcmp(keywords[i].cn, input) == 0) { printf("%s 对应的英文关键字为 %s\n", keywords[i].cn, keywords[i].en); break; } else if (strcmp(keywords[i].en, input) == 0) { printf("%s 对应的中文关键字为 %s\n", keywords[i].en, keywords[i].cn); break; } } if (i == sizeof(keywords) / sizeof(struct keywords)) { printf("未找到对应的关键字!\n"); } return 0; } ``` 运行效果: ``` 请输入C语言关键字:整型 整型 对应的英文关键字为 int ``` ``` 请输入C语言关键字:unsigned unsigned 对应的中文关键字为 无符号 ``` ``` 请输入C语言关键字:test 未找到对应的关键字! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值