当前位置: 首页 > article >正文

2月10日习题

14 届蓝桥杯 C++ 青少组中 / 高级组选拔赛 (STEMA)2022 12 18 日真

常见数据类型字节长度介绍

在 C++ 中,不同数据类型所占用的字节长度因编译器和操作系统的不同而有所差异,但在常见的 32 位和 64 位系统中,有相对固定的大小规律。以下是按照常见情况下数据类型字节长度从小到大的排序,并给出相应示例代码验证:

常见数据类型及字节长度

  1. bool:通常占用 1 个字节,用于表示布尔值(truefalse)。
  2. char:通常占用 1 个字节,用于存储单个字符。
  3. shortshort int:通常占用 2 个字节,用于存储较小范围的整数。
  4. int:在 32 位系统中通常占用 4 个字节,在 64 位系统中一般也占用 4 个字节,用于存储整数。
  5. longlong int:在 32 位系统中通常占用 4 个字节,在 64 位系统中通常占用 8 个字节,用于存储较大范围的整数。
  6. long longlong long int:通常占用 8 个字节,用于存储更大范围的整数。
  7. float:通常占用 4 个字节,用于存储单精度浮点数。
  8. double:通常占用 8 个字节,用于存储双精度浮点数。
  9. long double:其大小因编译器而异,一般大于等于 8 个字节,用于存储更高精度的浮点数。

示例代码

cpp

#include <iostream>
#include <iomanip>

int main() {
    std::cout << std::left << std::setw(15) << "数据类型" << std::setw(10) << "字节长度" << std::endl;
    std::cout << std::setfill('-') << std::setw(25) << "" << std::endl;
    std::cout << std::setfill(' ');

    std::cout << std::left << std::setw(15) << "bool" << std::setw(10) << sizeof(bool) << std::endl;
    std::cout << std::left << std::setw(15) << "char" << std::setw(10) << sizeof(char) << std::endl;
    std::cout << std::left << std::setw(15) << "short" << std::setw(10) << sizeof(short) << std::endl;
    std::cout << std::left << std::setw(15) << "int" << std::setw(10) << sizeof(int) << std::endl;
    std::cout << std::left << std::setw(15) << "long" << std::setw(10) << sizeof(long) << std::endl;
    std::cout << std::left << std::setw(15) << "long long" << std::setw(10) << sizeof(long long) << std::endl;
    std::cout << std::left << std::setw(15) << "float" << std::setw(10) << sizeof(float) << std::endl;
    std::cout << std::left << std::setw(15) << "double" << std::setw(10) << sizeof(double) << std::endl;
    std::cout << std::left << std::setw(15) << "long double" << std::setw(10) << sizeof(long double) << std::endl;

    return 0;
}

代码解释

  1. std::setwstd::left:用于格式化输出,使表格更加整齐。
  2. sizeof 运算符:用于获取数据类型的字节长度。
  3. 输出结果:程序会输出每个数据类型及其对应的字节长度。

从上面题衍生出的解法题:在 C++ 中,要计算 99999 除以几次 10 结果为 0,可以通过循环不断地将这个数除以 10,同时记录除法操作的次数,直到结果为 0 为止。以下是实现该功能的示例代码:

cpp

#include <iostream>

int main() {
    int num = 99999;
    int count = 0;

    // 循环进行除法操作,直到结果为 0
    while (num != 0) {
        num /= 10;
        count++;
    }

    std::cout << "99999 除以 " << count << " 次 10 结果为 0。" << std::endl;

    return 0;
}

代码解释:

  1. 初始化变量

    • num 初始化为 99999,表示要进行除法操作的数。
    • count 初始化为 0,用于记录除法操作的次数。
  2. 循环操作

    • 使用 while 循环,只要 num 不等于 0,就继续执行循环体。
    • 在循环体中,将 num 除以 10,并将结果重新赋值给 num
    • 每次执行除法操作后,count 的值加 1
  3. 输出结果

    • num 等于 0 时,循环结束,输出 99999 除以 10 的次数。

下列表达式结果为true的是( )。 'z' == 'Z' 'z' < 'Z' '9' > 'Z' 'c' +1> 'D'

分享

本题可根据字符在 ASCII 码表中的值来判断各个表达式的结果。

ASCII 码表相关知识

在 ASCII 码表中,字符都对应着一个唯一的整数值。其中,大写字母 A - Z 的 ASCII 码值范围是 65 - 90,小写字母 a - z 的 ASCII 码值范围是 97 - 122,数字字符 0 - 9 的 ASCII 码值范围是 48 - 57。

对各选项进行分析

选项一:'z' == 'Z'

在 ASCII 码表中,'z' 的 ASCII 码值是 122,'Z' 的 ASCII 码值是 90,二者不相等,所以 'z' == 'Z' 的结果为 false

选项二:'z' < 'Z'

由于 'z' 的 ASCII 码值 122 大于 'Z' 的 ASCII 码值 90,所以 'z' < 'Z' 的结果为 false

选项三:'9' > 'Z'

'9' 的 ASCII 码值是 57,'Z' 的 ASCII 码值是 90,57 小于 90,即 '9' 的 ASCII 码值小于 'Z' 的 ASCII 码值,所以 '9' > 'Z' 的结果为 false

选项四:'c' + 1 > 'D'

'c' 的 ASCII 码值是 99,'c' + 1 即 99 + 1 = 100'D' 的 ASCII 码值是 68。因为 100 大于 68,所以 'c' + 1 > 'D' 的结果为 true

综上,答案是 'c' + 1 > 'D'

本题可根据数组和指针的相关知识,对每个选项进行分析。

题干分析

已知定义 int a[5], *p = a;,这里定义了一个包含 5 个整数的数组 a,同时定义了一个整型指针 p,并将数组 a 的首地址赋给了指针 p。在 C++ 中,数组名在大多数情况下会隐式转换为指向其首元素的指针,所以 p 指向数组 a 的第一个元素 a[0]

选项分析

  • 选项 A:*&a[5]
    在 C++ 中,数组的下标是从 0 开始的。对于数组 a[5],其有效的下标范围是 0 到 4。a[5] 已经越界,因为它试图访问数组 a 的第 6 个元素,而该数组只有 5 个元素。&a[5] 是取越界元素的地址,再对这个越界地址进行解引用 *&a[5] 会导致未定义行为,所以该选项错误
  • 选项 B:a + 2
    数组名 a 在表达式中会隐式转换为指向数组首元素的指针。a + 2 表示的是一个地址,它指向数组 a 中第 3 个元素(因为指针的偏移是以其所指向的数据类型的大小为单位的),而不是对数组元素的引用,所以该选项错误
  • 选项 C:*(p + 5)
    指针 p 指向数组 a 的首元素 a[0]p + 5 表示指针 p 向后偏移 5 个 int 类型的位置,即指向 a[5],但数组 a 的有效下标范围是 0 到 4,a[5] 越界了。对越界地址进行解引用 *(p + 5) 会导致未定义行为,所以该选项错误
  • 选项 D:*(p + 2)
    指针 p 指向数组 a 的首元素 a[0]p + 2 表示指针 p 向后偏移 2 个 int 类型的位置,即指向 a[2]。对 p + 2 进行解引用 *(p + 2) 就相当于访问数组 a 的第 3 个元素 a[2],这是对数组元素的正确引用,所以该选项正确

综上,答案是 D。


http://www.kler.cn/a/540452.html

相关文章:

  • 综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型(Matlab)
  • 如何使用DeepSeek帮助自己的工作?
  • 点大商城V2-2.6.6源码全开源uniapp +搭建教程
  • 使用sunshine和moonlight串流时的音频输出问题
  • ubuntu文件同步
  • PostgreSQL 18新特性之DML语句RETURNING增强
  • Android多包路由方案: ARouter 路由库
  • java实现Http请求方式的几种常见方式
  • 安装zk的方法
  • 今日AI和商界事件(2025-02-10)
  • 网站的记住我功能与用户登录持久化
  • 【UVM】寄存器模型
  • opencv:基于暗通道先验(DCP)的内窥镜图像去雾
  • fastjson2学习大纲
  • init的service 启动顺序
  • 基于 gitee 的 CI/CD
  • 球弹跳高度的计算(信息学奥赛一本通-1085)
  • 【JavaScript】this 指向由入门到精通
  • HTML标题标签(<h1>、<h2>、<h3>)的正确使用策略与SEO优化指南
  • 网络安全 — 安全架构
  • 实现双向数据绑定
  • 局域网使用Ollama(Linux)
  • 智慧校园与理工大学:信息技术在高等教育中的应用
  • 使用Python爬虫获取淘宝商品评论API接口数据
  • 前瞻技术解密:未来生活的改变与机遇
  • 1-portal认证功能