首页 > 编程语言 >天天学编程Day11

天天学编程Day11

时间:2024-11-09 19:47:07浏览次数:3  
标签:头文件 定义 int 编程 函数调用 天天 编译 Day11 替换

每日一道编程题

104. 二叉树的最大深度

class Solution {
public:
    int ans = 0;
    int maxDepth(TreeNode* root) {
        dfs(root,1);
        return ans;
    }
    //使用深度优先遍历遍历二叉树 记录路径长度 不断更新全局变量最长长度
    //遍历完成后ans即为最长长度
    void dfs(TreeNode* r,int depth)
    {
        if(!r)return;//如果当前为空节点就返回
        ans = max(ans,depth);//更新最深深度
        dfs(r->left,depth+1);//向左搜索
        dfs(r->right,depth+1);//向右搜索
    }
};

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

        C/C++ 中的预处理器指令是在编译之前由预处理器处理的命令。预处理器指令以 # 开头,并且通常不需要分号。它们用于控制源代码的编译过程、定义常量、包含头文件、条件编译等。

        常见的预处理器指令有:

常见预处理器指令:

#define
用于定义宏。宏是一个名字和一个值或代码块之间的映射,通常用来简化代码,或实现常量替换。

#define PI 3.14159  // 定义一个常量宏

PI 被定义为 3.14159,每次在代码中遇到 PI 时,都会被替换为 3.14159

#include
用于包含头文件。在编译时,指定的头文件会被插入到当前文件中。常用于引入标准库或自定义头文件。

#include <stdio.h>  // 引入标准库头文件
#include "myheader.h"  // 引入自定义头文件

#include <stdio.h> 用于引入标准输入输出库,而 #include "myheader.h" 用于引入当前目录中的自定义头文件。

 #if, #ifdef, #ifndef, #else, #endif
条件编译指令,用于根据不同条件选择性地编译代码块。用于在不同的平台或环境下进行不同的处理。

#define DEBUG
#ifdef DEBUG
printf("Debugging mode\n");
#endif

 如果定义了 DEBUG,则输出调试信息;否则不输出。

#undef
用于取消先前定义的宏。

#define MAX_SIZE 100
#undef MAX_SIZE  // 取消定义

 #line
用于改变预处理器输出的文件行号。这通常用于调试工具中,改变源代码的显示行号。

#line 200 "new_file.c"

 #error
用于生成编译错误,可以输出一条错误信息并停止编译。

#error "This code is not supported"

 #pragma
用于向编译器发送特殊指令,编译器可以根据指令进行优化、警告控制等。

#pragma once  // 防止头文件被多次包含

 

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

宏定义函数调用在 C/C++ 中有以下几个显著区别:

  1. 替换方式

    • 宏定义是在预处理阶段进行的文本替换,所有出现宏名的地方都会被直接替换为宏定义的内容,类似于直接复制粘贴。
    • 函数调用是在运行时发生的,它是调用某个函数并跳转到该函数的位置,执行其中的代码。
    // 宏定义
    #define SQUARE(x) ((x) * (x))  // 宏定义,直接替换
    int a = SQUARE(3);  // 预处理阶段变成 int a = ((3) * (3)); 
    
    // 函数调用
    int square(int x) { return x * x; }
    int a = square(3);  // 运行时调用函数
    

  2. 参数处理

    • 宏定义的参数是简单的文本替换,不进行类型检查,因此可能会出现预期之外的副作用(例如:运算顺序问题)。
    • 函数调用会对参数进行类型检查和计算,并且具有更明确的作用域。
    // 宏定义
    #define SQUARE(x) ((x) * (x))  // 宏定义,直接替换
    int a = SQUARE(3);  // 预处理阶段变成 int a = ((3) * (3)); 
    
    // 函数调用
    int square(int x) { return x * x; }
    int a = square(3);  // 运行时调用函数
    

  3. 性能

    • 宏定义没有函数调用的开销,因为它只是在预处理阶段做替换,不需要跳转、栈管理等。
    • 函数调用需要进行堆栈操作和函数跳转,会有一定的性能开销,尤其是在频繁调用时。
  4. 调试

    • 宏定义的调试相对困难,因为它只是文本替换,不会显示在调试器中的调用栈上。
    • 函数调用在调试时可以清晰地显示在调用栈中,且具有类型信息和返回值等。
  5. 作用域

    • 宏定义没有作用域限制,在整个文件中都有效,可能导致命名冲突或副作用。
    • 函数调用有作用域限制,仅在函数内部有效,不会影响外部。

标签:头文件,定义,int,编程,函数调用,天天,编译,Day11,替换
From: https://blog.csdn.net/qq_73301411/article/details/143646092

相关文章

  • 面对对象编程:OOP类与对象详细笔记
    文章目录类类的概念:类的定义:类的属性(成员变量):**类的方法(成员方法):**对象对象的创建与使用:this关键字:构造方法:类与对象的关系:封装:无参方法有参方法类类的概念:类是一种用户定义的数据类型,它描述了一组具有相同特性和行为的对象。类定义了对象的状态(属性)和行为(方法)。......
  • 退休后编程?
    也算半退休状态,学习新的编程语言基本上不可能了,没精力也没用武之地。但是,我觉得有些代码,还会一直写下去。①VBA,我估计写了10年以上VB代码,用VB干过各种事情,应用软件,Web终端,通信的,办公的,共享软件……没想到,老了以后,发现可能会一直用下去,还是vb代码。如果我评价哪个语言最有价值,我认......
  • PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?
    相信每一个计算机科班出身的同学或许都有这样的经历:在大三的某一天,仿佛打通了全身筋脉一般把三年的所学:“数电里的与非门——[计算机体系结构]——汇编语言——C语言——C++语言——Java语言”。所有知识全部串联了起来。所有这些语言的出现都仿佛都有了必然性和追根溯源的历史......
  • Rust-AOP编程实战
    文章本天成,妙手偶得之。粹然无疵瑕,岂复须人为?君看古彝器,巧拙两无施。汉最近先秦,固已殊淳漓。胡部何为者,豪竹杂哀丝。后夔不复作,千载谁与期?——《文章》宋·陆游【哲理】文章本是不加人工,天然而成的,是技艺高超的人在偶然间所得到的。其实作者所说的“天成”,并不就是大自然的......
  • 实验3 类和对象-基础编程2
    实验任务1:Button.hpp,Window.hpp,task1.cpp,源码,运行测试结果如下#pragmaonce#include<iostream>#include<string>usingstd::string;usingstd::cout;//按钮类classButton{public:Button(conststring&text);stringget_label()const;......
  • PHP中的多线程与并发编程:如何提高处理能力
    在现代的网络应用中,处理能力是评估系统性能的一个关键指标。随着用户数量的激增和数据量的增加,单线程程序往往难以满足高并发的需求。虽然PHP本身是单线程的,但通过合理的多线程与并发编程技巧,我们依然可以提高处理能力,提升程序的响应速度和稳定性。理解PHP的并发模型是至关重要的......
  • 代码背后的智慧:20条编程感悟
    大家好,我是木宛哥;在10余年的工作经历让我深刻体会到软件开发不仅仅是写代码,更是一个系统化的交付过程。为此我总结了20条编程感悟,涵盖了代码规范、设计原则、测试方法与交付流程等多个方面;​通过遵循代码规范,让代码更加可读与可维护,同时合理的设计能够有效应对需求变化,模......
  • 实验3 类和对象_基础编程2
    实验任务一1#pragmaonce2#include<iostream>3#include<string>45usingstd::string;6usingstd::cout;78//按钮类9classButton{10public:11Button(conststring&text);12stringget_label()const;13voidcl......
  • 网络编程(一):UDP socket api => DatagramSocket & DatagramPacket
    目录1.TCP和UDP1.1TCP/UDP的区别1.1.1有连接vs无连接 1.1.2可靠传输vs不可靠传输 1.1.3面向字节流vs面向数据报1.1.4全双工vs半双工2.UDPsocketapi2.1DatagramSocket2.1.1构造方法2.1.2receive/send/close2.2DatagramPacket2.2.1......
  • 编程之路,从0开始:操作符详解
    Hello大家好!我们又见面啦!给生活添点passion,开启今天的编程之路!目录1、算术操作符2、移位操作符3、位操作符(1)按位与(2)按位或(3)按位异或(4)按位取反4、单目操作符(1)!操作符(2)szieof(3)(类型)5、逗号表达式7、关系操作符8、逻辑操作符9、?:操作符10、下标访问[],函数调用()11......