25 条题解
-
0
- 在 C++语言中,可以使用字符(如'0')作为数组下标。 ○ A. 对 ○ B. 错
答案是 A. 对。
作为教练,我带你透过现象看本质,这题考的是你对 char(字符)类型 的深度理解。
1. 揭开“字符”的伪装
在 C++ 的眼里,
char类型其实并没有那么特别,它本质上就是一个小整数。 每一个字符背后都有一个身份证号,叫做 ASCII 码。- 字符
'0'的真身是整数 48。 - 字符
'A'的真身是整数 65。 - 字符
'a'的真身是整数 97。
2. 编译器的视角
当你写下代码
a['0']时,编译器看到的其实是:a[48]因为数组下标要求的只是“整型数据”(int, long, char, short 等),而
char也是整型家族的一员,所以编译器完全接受这种写法。3. 实战中的应用(教练的经验)
这不光是对的,而且在 OI 竞赛中非常常用! 比如我们要统计一个字符串里每个字母出现了多少次,我们经常会这样写:
int count[256] = {0}; // 开一个够大的数组 char c = 'a'; count[c]++; // 实际上是在操作 count[97]这样可以直接用字符当索引来存取数据,非常方便。
4. 特别提醒
虽然语法是对的,但你要分清:
arr[0]:访问的是第 0 号位置。arr['0']:访问的是第 48 号位置。
两者千万别搞混了!
最终结论
A. 对
-
0
- 在 C++语言中,数组被定义时,它的大小就确定了。 ○ A. 对 ○ B. 错
答案是 A. 对。
作为教练,我来帮你建立一个形象的认知:
1. 形象比喻:数组就是“连号的电影票”
想象一下,你在定义一个数组
int a[5];的时候,就好比去电影院买票。 你对售票员(操作系统/编译器)说:“我要 5张 连在一起的座位。”- 售票员会立刻把 5个连续的座位 锁定给你。
- 关键点来了:一旦票出给你了,这排座位的数量就定死了。
- 如果你后来突然想带第 6 个人进去,能在原来的位置硬塞一个座位吗?不能。因为第 6 个位置可能已经被别人(其他变量)占用了。
2. 技术视角:内存的“硬”限制
在 C++ 中,普通的数组(比如
int a[100])在定义的那一刻,计算机就会在内存里划分出一块固定大小、连续的空间。- 为什么不能改? 因为内存空间是紧凑排列的。你的数组后面紧挨着可能就是其他的变量。如果你想让数组变大,就会覆盖掉别人的数据,这是绝对不允许的。
- 可是我在 Python/JS 里数组可以随便变大啊? 那是因为那些高级语言底层帮你做了“搬家”的操作(自动申请一块更大的新地盘,把旧数据搬过去)。但在 C++ 的原生数组概念里,地盘划好了就是划好了,不能原地扩建。
3. 教练提示
虽然 C++ 标准库里有一个叫
std::vector(动态数组/向量)的东西可以变长,但在考试题目中,如果只说“数组”二字,默认指的都是最原始的 C风格数组(如int a[10]),它的特性就是:出生即定型。最终结论
A. 对
-
0
- 计算机中存储的数据都是二进制形式。因此,在使用 C++语言编写程序时,将所有十进制数改写为相同数值的二进制数,会使得程序运行效率更高。 ○ A. 对 ○ B. 错
来,作为教练,我先问你一个生活中的问题:
假设你去饭店点一道“宫保鸡丁”。
- 方式一:你在菜单上写中文“宫保鸡丁”。
- 方式二:你查字典,把“宫保鸡丁”翻译成这道菜的原材料化学分子式写给厨师。
你觉得方式二会让厨师炒菜的速度变快吗?
显然不会。厨师最后炒出来的都是那盘菜,你的写法只会折磨你自己(和看你菜单的人),并不会改变炒菜的过程。
回到这道题,我们用编译原理的视角来看:
1. 谁在负责“翻译”?是编译器 (Compiler)
C++ 是高级语言,你写的代码(Source Code)并不是直接扔给 CPU 跑的,而是要先经过编译器(比如 g++)的处理,生成可执行文件(.exe)。
2. 编译时刻 vs 运行时刻
- 当你写
int a = 10;(十进制)时,编译器在编译阶段就把10翻译成了二进制000...1010塞进了可执行文件里。 - 如果你能直接写二进制(比如 C++14 标准支持的
0b1010),编译器同样是在编译阶段把它识别为000...1010塞进可执行文件里。
重点来了: 不管你在代码里怎么写(十进制
10、十六进制0xA、还是二进制),生成的机器指令(可执行文件)是完全一模一样的!3. 结论
既然生成的程序一模一样,运行时的效率自然也就没有任何区别。
如果你强行把所有数字都写成二进制,不仅不会变快,反而会让你的代码变得极其难读,属于“自找麻烦”。
最终答案
B. 错
-
0
- 在 C++语言中,表达式
(0xf == 015)的值为 true。 ○ A. 对 ○ B. 错
这是一道非常经典的**“进制陷阱题”**。作为教练,我要提醒你:千万不要只盯着数字本身看,要先看“帽子”(前缀)!
来,我们把这两个数翻译成十进制对比一下:
1. 左边选手:
0xf- 前缀
0x:这是 16进制(Hexadecimal) 的标志。 - 数值
f:在 16 进制中,a=10, b=11 ... f=15。 - 十进制值:15
2. 右边选手:
015(注意!陷阱在这里)- 前缀
0:很多同学会把它当成普通的十进制 15 看。大错特错! 在 C++ 中,以 0 开头的数字是 8进制(Octal)。 - 计算方法:
- 算一下:
- 十进制值:13
3. 裁判宣判
表达式变成了:
(15 == 13)很显然,这不相等。最终答案
B. 错
- 在 C++语言中,表达式
-
0
- 如果 a 为 int 类型的变量,且表达式
((a | 3) == 3)的值为 true,则说明 a 在从 0 到 3 之间(可能为 0、可能为 3)。 ○ A. 对 ○ B. 错
来,作为教练,我不直接告诉你答案,我们一起用二进制的视角把这层“面纱”揭开。
1. 核心工具:二进制视角的“或”运算 (
|)首先你要记住一句话:按位或运算(
|),只会在结果中“增加”1,绝对不会把 1 变回 0。 也就是:只要你有什么地方是 1,结果里那个地方肯定也是 1。2. 拆解数字
3题目里的关键数字是 3。 把它转成二进制(假设是低几位):
...0000 00113. 还原案发现场
题目说:
a | 3 == 3。 我们把算式竖着写出来看一看:a : ? ? ? ? ? ? ? ? | 3 : 0 0 0 0 0 0 1 1 (二进制) ---------------------------- = 3 : 0 0 0 0 0 0 1 1请盯着上面的竖式思考两个问题:
- 低 2 位(红框部分):因为
3的最后两位已经是1了,不管a的最后两位是0还是1,结果肯定都是1。所以,a的最后两位可以是任意值(00, 01, 10, 11)。 - 高位(前面的 0):结果要求高位必须全都是
0。- 如果
a在高位哪怕藏了一个1(比如a=4,二进制100),那么结果的高位也会变成1(结果变成 7),这就不等于 3 了。 - 结论:
a的高位必须全都是 0。
- 如果
4. 收网
a的高位必须全是 0。a的低 2 位可以是 00, 01, 10, 11。
拼起来,
a的二进制只能是这四种情况:...0000(十进制 0)...0001(十进制 1)...0010(十进制 2)...0011(十进制 3)
这正好对应了题目里说的 “a 在从 0 到 3 之间”。
最终答案
这个说法是 A. 对。
- 如果 a 为 int 类型的变量,且表达式
信息
- ID
- 4769
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者