软件评测师2020年考试上午C语言试题解析

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。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值