第15届蓝桥杯青少组STEMA考试C++中高级真题试卷(2024年3月)选择题部分

选择题

第 1 题    单选题

(110010)2+(c3)16的结果是(  )。

A.(240)10

B.(11110101)2

C.(366)8

D.(f6)16

解析:

二进制数110010 和 十六进制数 C3 相加

快速做法是将二进制数110010 转换成十六进制后与十六进制数 C3(原因是相加位数少,快一点,当然视自己所长,比如觉得二进制相加进位够简单,也可以选二进制相加等等),将所得的数为 F5 ,对应二进制值为 11110101 ,对应八进制数 365(这里先将十六进制转成二进制后,就可以将二进制转为八进制),到这里就发现B选项正确,C、D有问题,A就不再去看了。

因此答案是 B。

第 2 题    单选题

表达式1000/3的结果是(   )。

A.333

B.333.3

C.334

D.333.0

解析:

C++中表达式中根据数据形式(或者说数据类型)决定了输出结果是什么。

1000/3 由于1000和3都是整数,因此表达式1000/3的结果就只能是整数,小数部分精度丢失,1000/3的结果就是333。

因此答案是A 。

第 3 题    单选题

下列选项中,判断a等于1并且b等于1正确的表达式是()。

A.!((a!=1)&&(b!=1))

B.!((a!=1)||(b!=1))

C.!(a==1)&&(b==1)

D.(a=1)&&(b=1)

解析:

“判断a等于1并且b等于1正确”,首先我们先按题目的条件要求设计一个表达式:a==1 && b==1

然后检查各选项中表达式里的处理优先级从高到低次序为:绿

以及分析表达式的效果

这种题型不管处理方式如何选择,都要注意投入样例测试来分析检验:比如题中a和b,这时要测试的样例就有【1】a真b假【2】a假b真【3】ab都假【4】ab都真

A选项 !((a!=1)&&(b!=1)) ,意思是“取反(a不等于1且b不等于1)”,也就意味只要a和b中一个为1,结果就为真,显然这样不行。

B选项 !((a!=1)||(b!=1)) ,意思是“对(只要a或b其中一个不等于1以及a和b都不为1就为真的结果)取反”即为假,也就意味着“a和b都等于1”为真,这个符合要求,因此是正确答案。

C选项 !(a==1)&&(b==1) ,意思是“要求a不为1时且b为1时”为真,明显不符合。

D选项 (a=1)&&(b=1) ,注意这里是赋值运算符“=”而不是比较是否相等的运算符“==”,因此意思就成了“将a赋值为1 且 将b赋值为1”,不管a和b原来初始化为什么或者输入什么统统赋值为1,“&&”两边都是1,也就是都为真,这就成了“啊对对对”,错误。

第 4 题    单选题

定义 char a[]="His name is Jack",请问 sizeof(a)的结果是()。

A.14

B.15

C.16

D.17

解析:

这里其实涉及了两个知识点:【1】字符数组存储字符串的过程【2】sizeof函数的理解。因此从这两方面开始讲:

【1】字符数组存储字符串的过程

char a[]="His name is Jack"

建立一个字符数组a,使用"His name is Jack"这个字符串给a进行初始化,要将字符串中的字符存入字符数组,就必然在末尾带上了一个字符串结束符‘\0’,所以除了"His name is Jack"这里面的16个字符外,还在末尾存入了一个字符串结束符‘\0’,所以是17个字符。

【2】sizeof函数的理解

sizeof函数对于数组的作用是输出数组占用的总字节长度,举个例子:

int a[] = {1,45,2,33,123,67};

cout<<sizeof(a);

这时输出的是24,也就是24字节,因为一个整数类型int变量占用4字节,而数组a里有6个int类型元素,所以是24字节。

那么题目中sizeof(c)的意思自然就是输出数组c里的数据占用字节数,又因为一个字符类型变量占用1个字节,从【1】可见总共17个字符存入,所以数组c的长度为17,也就是“ sizeof(a)”输出17。

第 5 题    单选题

定义 int a[]={5,1,3,8,2,9,0,6},*p=(a+3),那么((*p)-- + *p )的值是()。

A.3

B.10

C.15

D.16

解析:

指针,或者说题目的考点是数组和指针。

首先讲两点:第一指针存放的内存地址,第二数组名实际是一个指向数组第一个元素起始位置内存地址的指针。

因此,在定义 int a[]={5,1,3,8,2,9,0,6},*p=(a+3)这里,其中*p出现在定义过程中,变量p前面带着*,说明p是一个指向int类型变量的指针,a+3中的a是数组名所以是指向a[0]的指针,那么a+3实际就是指向a[3]的指针,*p=(a+3)就是把a[3]的内存地址给到指针p。

定义完后,*p再次出现,可是现在*p并不是一个定义的新变量了,这时候的*就成了间接说明符,表示提取出指针p所指向的变量的值,也就是a[3]的值8,因此((*p)-- + *p )就成了

((a[3]-- + a[3]) 注意这里的----是自减运算也就是-1,而且是后缀写法。但是这里发生了什么,我们来解析一下:

捋一捋这里((*p)-- + *p )执行的过程:【1】首先是(*p)--先给出一个*p,将里面的值8输出;【2】还是(*p)--这里的--,将p指针指向位置的数据-1,现在*p值改为7了;【3】+ *p这里再取一次*p值。

因此表达式就成了这样:8 + 7 ,所以答案是15,选择C。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值