寒假作业Day 08

寒假作业Day 08

一、选择题

1、下列关于 const 和 #define 定义常量的区别,说法不正确的有( )
A: define宏是在预处理阶段展开。const常量是编译运行阶段使用
B: 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
C: define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
D: const定义和#define定义的常量在程序运行过程中只有一份拷贝

A: define宏是在预处理阶段展开。const常量是编译运行阶段使用
这个说法是不完全正确的。#define宏确实是在预处理阶段展开,但是const常量并不是在编译运行阶段使用,而是在编译阶段就已经确定了其值,并且在运行时是不可变的。所以,A选项中的“编译运行阶段使用”是不准确的。

B: 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
这个说法是正确的。#define宏只是简单的文本替换,没有类型,也不做类型检查。而const常量是有类型的,并且在编译阶段会进行类型检查。

C: define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
这个说法也是正确的。宏在预处理阶段会根据其在代码中的使用次数进行展开,并且不会分配内存。而const常量确实会在内存中分配存储空间,具体是在栈中还是堆中取决于其定义的位置和方式。

D选项说的是:“const定义和#define定义的常量在程序运行过程中只有一份拷贝。” 这个说法中,“const定义在程序运行过程中只有一份拷贝”是正确的,因为const常量在内存中确实有唯一的存储空间。但是,将#define宏与const常量相提并论,并说它们都有一份拷贝是不准确的,因为#define宏只是文本替换,并没有在内存中分配存储空间。

在这里插入图片描述

这个宏接收两个参数 x ,y,如果在上述声明之后,你把 Mul(x,y) 置于程序中,预处理器就会⽤下⾯这个表达式替换上⾯的表达式:++x*++y
a+b=3,b+c=5,++(a+b)*++(b+c)=++3 * ++5,即4 *6=24
大家是不是以为是这样的,但实际上,当我们使用编译器编译,我们会发现,最后的答案却为14,这是为什么呢?
其实真正的带入是这样子的:++a + b * ++b + c=2+3 * 3+3=14

在这里插入图片描述

对于上述关于预编译和编译的说法,我们可以逐一分析:
A: C语言由源代码生成的各阶段如下,C源程序-编译预处理-编译-优化程序-汇编程序-链接程序-可执行文件
这个说法是正确的。C语言源代码首先经过预处理器处理,包括宏替换、条件编译等;然后经过编译器编译成汇编代码;接着汇编器将汇编代码转换成机器代码;最后链接器将多个目标文件(包括库文件)链接成一个可执行文件。

B: 常见的预编译指令有#include,#define,#if、#else和#endif
这个说法也是正确的。这些确实是C语言中常见的预处理指令。

C: 编译程序可以识别一些特殊的符号,比如__LINE__ ,表示当前行号的整数,这些是在编译阶段处理的
这个说法不完全准确。__LINE__这样的预定义宏是在预处理阶段处理的,而不是编译阶段。预处理阶段会替换这些宏为相应的值(例如当前源代码行号)。

D: #define定义宏,可以多次使用
这个说法是正确的。#define是C语言中的预处理指令,用于定义宏,宏可以在代码中多次使用,并在预处理阶段被替换为其定义的值或表达式。

在这里插入图片描述

A: 预处理命令行必须使用分号结尾
这是不正确的。预处理命令行(如#include, #define等)后面不需要分号。分号是在C语言源代码中用来表示语句结束的,而预处理命令行并不是C语言的语句。

B: 凡是以#号开头的行,都被称为编译预处理命令行
这是正确的。在C语言中,任何以#开头的行都被视为预处理指令或预处理命令行。这些行在编译的预处理阶段被处理。

C: 预处理命令行不能出现在程序的最后一行
这是不正确的。预处理命令行可以出现在程序的任何位置,包括最后一行。只要它们是有效的预处理指令,编译器就会在预处理阶段对它们进行处理。

D: 预处理命令行的作用域是到最近的函数结束处
这也是不正确的。预处理命令行的作用域通常是全局的,它们在整个源文件中都有效,而不是仅限于最近的函数结束处。例如,使用#define定义的宏可以在整个源文件中使用,而不仅仅是定义它的那个函数。

在这里插入图片描述

在main函数开始执行时,a已经被定义为10,所以在main函数中的第一个printf语句会输出10…。

接下来调用foo函数。在foo函数中,a的原始定义(10)被#undef取消了,然后a被重新定义为50。但是,请注意,#undef和#define指令在foo函数中的修改不会影响到main函数中a的值,因为预处理器指令的修改是全局的,但是它们的修改在预处理阶段就已经确定,并且不会随着函数的调用而改变。

当foo函数返回后,main函数中的第二个printf语句继续执行,此时a的值仍然是10,因为在预处理阶段a的值就已经确定为10了,即使foo函数中进行了重新定义,也不会影响到main函数中a的值。

二、编程题

在这里插入图片描述

#include <stdio.h>

int main() {
	//首先把1~100000的值都存储到数组里,以便之后使用
    int a[100000] = {0};
    a[0] = 1;
    a[1] = 2;
    for (int i = 2; i < 100000; i++) {
        a[i] = 2 * a[i - 1] + a[i - 2];//这是数值规律
        a[i] %= 32767;//每次都模一个32767防止数值溢出
    }

    int n = 0;
    scanf("%d", &n);
    while (n--) {
        int k = 0;
        scanf("%d", &k);
        printf("%d\n", a[k - 1]);//因为数组从0下标开始
    }
    return 0;
}

在这里插入图片描述

方法一:用for循环

#include <stdio.h>
#include<string.h>

int main() {
    char arr[1000] = {0};
    int count_English = 0;
    int count_Space = 0;
    int count_Number = 0;
    int count_Else = 0;
    gets(arr);
    int len=strlen(arr);
    for(int i=0;i<len;i++) {
        if (arr[i] >= 'a' && arr[i]<= 'z' || arr[i] >= 'A' && arr[i] <= 'Z') {
            count_English++;
        }

        else if (arr[i] == ' ') {
            count_Space++;
        }

        else if (arr[i] >= '0' && arr[i] <= '9') {
            count_Number++;
        }

        else {
            count_Else++;
        }
    }
    printf("%d\n%d\n%d\n%d\n", count_English, count_Space, count_Number, count_Else);
    return 0;
}

方法二:用while循环

#include <stdio.h>
#include<string.h>

int main() {
    char arr[1000] = {0};
    char* p=arr;
    int count_English = 0;
    int count_Space = 0;
    int count_Number = 0;
    int count_Else = 0;
    gets(arr);
    while(*p) {
        if (*p >= 'a' && *p <= 'z' || *p >= 'A' && *p <= 'Z') {
            count_English++;
        }

        else if (*p == ' ') {
            count_Space++;
        }

        else if (*p >= '0' && *p <= '9') {
            count_Number++;
        }

        else {
            count_Else++;
        }
        p++;
    }
    printf("%d\n%d\n%d\n%d", count_English, count_Space, count_Number, count_Else);
    return 0;
}

两者的区别在于一个用指针,一个用数组下标,其实核心方法都是一个样子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机找不到api-ms-win-core-path-l1-1-0的5种解决方法

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是找不到某些系统文件。最近&#xff0c;许多用户反映他们在使用电脑时遇到了“找不到api-ms-win-core-path-l1-1-0文件”的问题。这个问题通常出现在Windows操作系统中&#xff0c;可能会影响到一…

【Linux】编译器-gcc/g++使用

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 初见gcc和g3. 程序的翻译过程3.1 预处理3.1.1 宏替换 去注释 头文件展开3.1.2 条件编译 3.2 编译3.3 汇编3.4 链接 4. 链接4.1 动态链接4.2 静态链接 1. 前言 在之…

DRC:扩散模型的推荐系统应用

1 Title Diffusion Recommender Model&#xff08;Wenjie Wang、Yiyan Xu、Fuli Feng、Xinyu Lin、Xiangnan He、Tat-Seng Chua&#xff09;【SIGIR 23】 2 Conclusion . In light of the impressive advantages of Diffusion Models (DMs) over traditional generative model…

万字完整版【C语言】指针详解~

一、前言 初始指针&#xff08;0&#xff09;&#xff1a;着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针&#xff08;1&#xff09;&#xff1a;讲解指针变量常见的类型&#xff0c;如何去理解这些类型、最后就是如何正确的使用深入指针&#…

【语法基础练习】1.变量、输入输出、表达式与顺序语句

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;算法练习&#x1f338;今日语录&#xff1a;You don’t know until you try. 文章简介&#xff1a;下面的题目是AcWing网站语法基础练习篇的第一小节&#xff0c;内容基础&#xff0c;难度&#xf…

如何进入Windows 11的安全模式?这里提供详细步骤

序言 如果你在启动Windows 11 PC时遇到问题,则重新启动到安全模式可能会有所帮助,该模式会暂时禁用驱动程序和功能,以使你的PC更稳定。下面是如何做到这一点。 在Windows 7和更早版本中,通常可以在打开电脑后按功能键(如F8)启动安全模式。Microsoft从Windows 8中删除了…

MybatisPlus知识点总结(基于黑马2023MybatisPlus课程)

MybatisPlus知识点总结 配套资料 黑马微服务框架笔记&#xff0c;内含mpMybatisPlus.pptxMyBatis-Plus &#xff08;mp中文官网&#xff09; 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a;1.引入MybatisPlus依赖&#xff0c;代替Mybatis依赖2.定义Mapper接口并继…

C++_可变参数模板

目录 1、可变参数模板的用法 2、参数包展开 2.1 递归方式展开 2.2 逗号表达式形式展开 3、参数包的大小 结语 前言&#xff1a; C11引入了可变参数模板&#xff0c;他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数&#xff0c;在C11前&#x…

16. C++标准库

C标准库兼容C语言标准函数库&#xff0c;可以在C标准库中直接使用C语言标准函数库文件&#xff0c;同时C标准库增加了自己的源代码文件&#xff0c;新增文件使用C编写&#xff0c;多数代码放在std命名空间中&#xff0c;所以连接C标准库文件后还需要 using namespace std;。 【…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

Seata 2.x 系列【6】微服务项目搭建

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 数据库…

2024年3月ZZUACM 招新赛题解

2024年3月ZZUACM 招新赛 题号题目A区间次大值B上课签到C魔法森林&#xff08;一&#xff09;D魔法森林&#xff08;二&#xff09;ELOPF跳格子G猜数字H抽卡记录I安达的二维矩阵J安达的数字手术K跳楼梯L前缀和 A 区间次大值—循环/签到题 题目描述 给定一个 n n n的全排列 a i…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

自然语言处理: 第十三章P-tuing系列之P-tuning V1

项目地址: P-Tuning 论文地址: [2103.10385] GPT Understands, Too (arxiv.org) 理论基础 正如果上一节介绍LoRA(自然语言处理: 第十二章LoRA解读_lora自然英语处理-CSDN博客)一样,本次介绍的在21年由清华团推提出来的 P-Tuning V1系列也属于PEFT(参数高效微调系列)里的一种&…

【前端】平面转换与渐变

目录 1.字体图标 2.平面转换 2.1位移 2.2旋转 2.3多重转换 2.4缩放 3.渐变 1.字体图标 引入iconfont平台字体图标样式表 <link rel"stylesheet" href"./iconfont/iconfont.css"> <i class"iconfont xx"></i> 第一个类…

函数柯里化:JavaScript中的高级技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

学习嵌入式C语言要掌握到什么程度?

学习嵌入式C语言要掌握到什么程度&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#…

anaconda问题合集

目录 一. 万分注意 二. ImportError: DLL load failed while importing _ctypes: 找不到指定的模块。 1. 发生情况 2. 导致结果和解决方法 三. WARNING: A newer version of conda exists. 1. 在conda install 某库的时候 2. 解决方法 一. 万分注意 不要轻易使用 conda …

YOLO建筑物损伤评估数据集

YOLO建筑物损伤评估数据集&#xff0c;重度损伤&#xff0c;轻微损伤&#xff0c;中度损伤&#xff0c;未损伤4类&#xff0c;近五千张图像&#xff0c;yolo标注完整&#xff0c;应用数据增强。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集…

举个栗子!Alteryx 技巧(10):解决连数据库时出现中文乱码的问题

在日常工作中&#xff0c;我们经常遇到需要连接 Oracle 数据库的场景。当采用 ODBC 的方式进行连接时&#xff0c;可能会出现中文乱码。那么&#xff0c;应该如何解决中文乱码这个问题呢&#xff1f; 本期《举个栗子&#xff01;Alteryx 技巧》&#xff0c;我们就来分享方法吧…