每日计划-1109

1. 完成 104. 二叉树的最大深度

class Solution {
public:// 计算二叉树的最大深度的函数int maxDepth(TreeNode* root) {// 如果根节点为空,说明已经到达叶子节点的下一层,返回0(这里代码中 return false 应该是错误的,应该是 return 0)if (!root) return 0;// 递归计算左子树的最大深度int L = maxDepth(root->left);// 递归计算右子树的最大深度int R = maxDepth(root->right);// 返回左右子树中较大的深度加1(因为当前节点本身也算一层)return max(L, R) + 1;}
};

2. 八股部分

1) C/C++ 中的预处理器指令有哪些?举例说明其用途。 

  1. #include指令
    • 用途:用于将指定的头文件内容包含到当前源文件中。头文件中通常包含函数声明、变量声明、宏定义、结构体定义等内容,通过#include可以方便地在多个源文件中共享这些定义,避免重复编写代码。
    • 示例
      • 例如,在一个 C++ 程序中,如果要使用输入输出流(iostream)相关的功能,需要在源文件开头包含<iostream>头文件:
#include <iostream>
int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

这里的#include <iostream>iostream头文件中的内容引入到当前源文件,使得可以使用coutendl等对象进行输出操作。如果不包含这个头文件,编译器将无法识别coutendl等符号。

2. #define指令

  • 用途:用于定义宏。宏可以是常量的别名,也可以是一段代码的缩写,在预编译阶段会将代码中出现的宏名替换为其定义的内容。
  • 示例
    • 定义常量宏:
#define PI 3.14159
int main() {double radius = 5.0;double area = PI * radius * radius;std::cout << "圆的面积为:" << area << std::endl;return 0;
}

这里的#define PI 3.14159定义了一个常量宏PI,在代码中使用PI时,预处理器会将其替换为3.14159

#define MAX(a, b) ((a) > (b)? (a) : (b))
int main() {int x = 10, y = 20;int max_value = MAX(x, y);std::cout << "最大值为:" << max_value << std::endl;return 0;
}

这里的#define MAX(a, b) ((a) > (b)? (a) : (b))定义了一个宏MAX,它接受两个参数ab,并返回较大的值。在代码中使用MAX(x, y)时,预处理器会将其展开为((x) > (y)? (x) : (y))
3. #ifdef#ifndef#endif指令

  • 用途:用于条件编译,根据条件决定是否编译某段代码。#ifdef用于判断某个宏是否已定义,#ifndef用于判断某个宏是否未定义,#endif用于结束条件编译块。
  • 示例
    • 例如,假设有一个调试宏DEBUG,在调试时希望输出一些调试信息,而在正式发布时不希望包含这些调试信息,可以这样使用条件编译:
  • 定义带参数的宏(类似函数的功能,但有区别,后面会详细解释):
#define DEBUG
int main() {int value = 10;
#ifdef DEBUGstd::cout << "调试信息:当前值为 " << value << std::endl;
#endifreturn 0;
}

当定义了DEBUG宏时(如上述代码所示),#ifdef DEBUG#endif之间的代码会被编译,输出调试信息。如果没有定义DEBUG宏,这段代码将不会被编译,不会生成额外的调试输出代码,从而减小可执行文件的大小,提高程序的执行效率。

  • 使用#ifndef类似,例如防止头文件重复包含:
#ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件的内容,如结构体定义、函数声明等
#endif

第一次包含这个头文件时,MY_HEADER_H未定义,#ifndef MY_HEADER_H条件成立,会定义MY_HEADER_H并编译头文件内容。后续再次包含时,由于MY_HEADER_H已定义,#ifndef MY_HEADER_H条件不成立,头文件内容不会被重复编译,避免了重复定义错误。
4. #undef指令

 

  • 用途:用于取消已定义的宏。
  • 示例
#define FOO 42
int main() {std::cout << "FOO的值为:" << FOO << std::endl;
#undef FOO
// 这里再次使用FOO会导致编译错误,因为它已被取消定义
// std::cout << "取消定义后FOO的值为:" << FOO << std::endl;return 0;
}

在上述代码中,先定义了宏FOO,然后使用#undef FOO取消了它的定义。取消定义后,如果再尝试使用FOO,编译器会报错,除非在后续代码中重新定义它。
5. #pragma指令

  • 用途:这是一个特定于编译器的指令,用于向编译器提供额外的信息或控制编译器的行为。不同的编译器对#pragma指令的支持和用法可能不同。
  • 示例
    • 例如,在一些编译器中,可以使用#pragma once来确保头文件只被编译一次,类似于前面提到的#ifndef#define#endif的组合,但更简洁(不过不是所有编译器都支持#pragma once):
#pragma once
// 头文件的内容

 还有一些编译器可以使用#pragma warning来控制警告信息的显示或忽略,例如:

#pragma warning(disable : 4996)  // 禁用特定的警告(这里假设4996是某个编译器的警告编号,用于举例)
int main() {// 可能会产生警告的代码return 0;
}

 

2) 解释一下宏定义和函数调用的区别。

  1. 执行时机不同
    • 宏定义:在预编译阶段进行文本替换,也就是在编译程序之前,将代码中所有出现的宏名替换为其定义的内容。例如,对于宏#define MAX(a, b) ((a) > (b)? (a) : (b)),在预编译时会直接将MAX(x, y)替换为((x) > (y)? (x) : (y)),然后再进行编译。
    • 函数调用:在程序运行时,当执行到函数调用语句时才会跳转到函数定义处执行函数体中的代码,执行完函数后再返回到调用点继续执行后续代码。
  2. 参数处理方式不同
    • 宏定义:宏定义中的参数只是简单的文本替换,没有类型检查。例如,MAX(1, 2)MAX(1.0, 2.0)都会按照宏定义的规则进行替换,但如果宏定义中的参数在替换后出现语法错误(如MAX(1, "hello"),替换后可能会导致比较操作不合法),编译器可能无法在预编译阶段检测到,直到编译阶段才可能报错,而且错误信息可能不太直观,因为是基于替换后的代码报错。
    • 函数调用:函数调用时会对参数进行类型检查,确保传递的参数类型与函数定义中的参数类型匹配。如果类型不匹配,编译器会在编译阶段报错,并且错误信息通常会明确指出参数类型不匹配的问题。例如,定义了一个函数int add(int a, int b),如果调用add(1, 2.0),编译器会提示参数类型不匹配的错误。
  3. 返回值处理不同
    • 宏定义:宏本身没有返回值的概念,它只是进行文本替换。虽然可以通过宏定义实现类似返回值的效果(如上面MAX宏通过三元表达式返回较大值),但本质上还是文本替换后的表达式计算结果。
    • 函数调用:函数有明确的返回值类型,函数体中的return语句用于返回一个值,这个值的类型必须与函数声明的返回值类型兼容。函数调用可以将返回值赋给变量或用于其他表达式的计算。例如,int result = add(1, 2);,函数add返回计算结果,然后赋值给result变量。
  4. 代码大小和执行效率方面的差异(在简单情况下)
    • 宏定义:如果宏定义在代码中多次使用,每次使用都会进行文本替换,可能会导致代码膨胀,生成的可执行文件可能会更大。但由于是在预编译阶段进行替换,没有函数调用的开销(如函数调用时的参数压栈、栈帧创建与销毁、返回地址保存与恢复等操作),在某些情况下执行效率可能会更高,尤其是对于简单的、频繁调用的宏(如简单的数学计算宏)。
    • 函数调用:函数代码只存在一份,无论在代码中调用多少次,不会像宏定义那样导致代码大量重复(除非是内联函数,内联函数会在调用处展开代码,类似宏替换,但内联函数仍然有函数的特性,如类型检查等,并且编译器会根据一定规则决定是否内联展开)。不过函数调用会有一定的开销,对于频繁调用的简单函数,函数调用开销可能会对性能产生一定影响。例如,一个简单的函数用于计算两个整数的和,如果在一个循环中频繁调用这个函数,函数调用的开销可能会比直接使用宏计算和的开销大(但实际情况中,现代编译器会对函数进行优化,如内联优化等,可能会减少这种性能差异)。
  5. 作用域和生命周期不同
    • 宏定义:宏定义的作用域从定义处开始,到文件末尾结束,除非被#undef取消定义。宏不存在像函数那样的局部变量和局部作用域概念,它只是在预编译阶段进行文本替换,对整个代码中的文本进行影响。
    • 函数调用:函数有自己的作用域,函数内部定义的变量是局部变量,其生命周期在函数调用时开始,函数返回时结束。函数可以在不同的作用域中被调用,并且可以通过参数传递和返回值与其他部分的代码进行交互。例如,在一个函数内部定义的局部变量不会影响到其他函数中的同名变量,而宏定义在整个文件中替换后可能会影响到其他部分代码中相同宏名的使用(如果有重名情况且没有适当的作用域隔离机制,如在不同的函数中使用相同宏名但期望不同行为时可能会出现问题)。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv5的人群密度检测系统设计与实现

大家好&#xff0c;本文将介绍基于改进后的YOLOv5目标检测模型&#xff0c;设计并实现人群密度检测系统。 使用YOLOv5的源代码&#xff0c;在此基础上修改和训练模型&#xff0c; 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改&#xff0c;更换主干网络、改进损失…

鸿蒙入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染&#xff1a;执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新&#xff1a;即父组件中状态变量更新…

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个&#xff1a; 1. npm (Node Package Manager) 简介&#xff1a; npm 是 Node.js 的默认包管理器&#xff0c;也是最广泛使用的包…

【go从零单排】Random Numbers、Number Parsing

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 这里是引用 &#x1f4bb;代码 Random Numbers package mainimport ("fmt…

qt移植到arm报错动态库找不到

error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环境变量。 例如&#xff1a; 前…

GoogleMIT:多智能体医疗决策框架MDAgents

|记昨日与国内某Top 1&2 医院科室老师及团队探讨技术、医学、信仰与责任而有感而发。 生成式基础大模型正在成为临床辅助甚至医学探索领域的宝贵工具。尽管我们在国内看到了很多企业或实验室联合医疗机构在如医疗记录生成、临床表型辅助诊疗、医疗知识问答交互、医院管理决…

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL&#xff1f;慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析&#xff1a;600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…

高校大数据人工智能教学沙盘分享

大数据教学实训沙盘&#xff08;TipDM-SP&#xff09;是根据企业实际项目建设而成&#xff0c;并提供沙盘配套装置、软件以及教学实训资源。沙盘的作用主要有3个&#xff1a; 1、采集真实数据&#xff0c;解决教学中缺少真实数据的困扰&#xff1b; 2、形成从数据…

【C++】string模拟实现

各位读者老爷好&#xff0c;俺最近在学习string的一些知识。为了更好的了解string的结构&#xff0c;俺模拟实现了一个丐版string&#xff0c;有兴趣的老爷不妨垂阅&#xff01;&#xff01;&#xff01; 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…

c_str()函数 string类型转换成char*类型 C++实现

问题&#xff1a;在 class 的构造函数中&#xff0c;如果我们在类中初始化了 char * 类型&#xff0c;在调用构造函数时&#xff0c;如果直接传入字符串( string )类型&#xff0c;编译器会提出如下警告&#xff1a; 想要消除这个警告&#xff0c;就需要将 string 类型的变量转…

【vue3文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的】

文件上传同时出现两个提示框&#xff0c;一个提示成功&#xff0c;一个提示失败&#xff0c;一个是用写死的&#xff0c;一个是接口返回的 原因&#xff1a; 接口返回的是字符串code200" 把判断的code码改为字符串的就好了

选择哪种Facebook广告目标更有效

在Facebook广告投放中&#xff0c;广告目标的选择决定了投放效果和转化率&#xff0c;但很多人往往忽略了这一步的细节。今天&#xff0c;我们来一起看看Facebook广告目标有哪些&#xff0c;以及如何精准选择&#xff01; 1. 广告目标在投放中的重要性 广告目标不仅仅是一…

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术&#xff0c;前文提到过小波变换&#xff0c;但是发现小波变换非常适合传输缩略图&#xff0c;实现渐进式传输每次传输的数据量不一样&#xff0c;这是因为每次变换之后低频成分大约是上一…

【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描&#xff08;CBCT&#xff09;重建的几何感知学习方法 锥形束计算机断层扫描&#xff08;CBCT&a…

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备&#xff0c;在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断&#xff0c;实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…

机器学习—神经网络的Softmax输出

为了建立一个能进行多类分类的神经网络&#xff0c;将采用Softmax回归模型&#xff0c;把它放入神经网络的输出层&#xff0c;如何实现&#xff1f; 当我们用两门课做手写数字识别的时候&#xff0c;我们使用这种架构的神经网络&#xff0c;如果你现在想用十个类进行手写数字分…

web——sqliabs靶场——第五关——报错注入和布尔盲注

这一关开始上强度了&#xff0c;不回显东西了&#xff0c;又要学到新的东西了 发现它没有正确的回显&#xff0c;学到了新知识&#xff0c;报错注入 报错注入 什么是报错注入&#xff1a; MySQL提供了一个 updatexml() 函数&#xff0c;当第二个参数包含特殊符号时会报错&am…