2020年软件评测师考试中出现了一道类似这样的考察C语言特性的题目:
#include<stdio.h> void main() { int s = 33; if (3<s<50){ printf("s<50 s>3"); } else{ printf("end"); } }
输出是什么?
当然,我们知道,C语言编程中,如果判断一个数大于下限、小于上限,不能这样写:3<s<50。应该写作3<s && s<50。但是,这样的语句可以通过编译,并且有输出。
对3<s<50的求值,先算3<s 是true,在C中,true是1,再算 1<50,是true,于是进入上面的printf
如果s取值是大于50 或者小于3的整数,3<s是false,在C中,false是0,再算0<50,也是true,于是还是进入上面的printf。
不管s取什么整数值,都是进入上面的分支语句。OK。现在答案就是:正常输出上面的分支的结果。
其他答案还有:不能通过编译、输出下面分支、运行时报错。都是不对的。
解析:这道题考察了比较深的C语言知识,首先,C的布尔类型是使用了基础的长整数类型实现,它本身原先并不是基本类型。
后来标准扩充定义bool类型,true是1,false是0,定义长度是1个字节(8位)。有人面试时会问到为什么C里面定义是8位,因为C语言设计的类型,最少存储也只能定义1个字节……定义1位逻辑上是可以的,但是实现上,操作系统存1位比较费劲。你这儿有1位,别处都是几个字节,字节上对不齐,操作系统向存储器要地址,寻址很烦的。
布尔类型,其名称来源于英国数学家George Boole。
微软的MFC里面定义了BOOL(大写),
typedef long BOOL #define FALSE 0 #define TRUE 1
C语言定义了bool(小写)。bool , true, false。隐式类型转换时,非零值会被转换为true,零值会被转换为false。