Flink常见面试问题(附答案)

news2024/11/15 18:47:23

目录

  • 基础篇
    • 1. 什么是Apache Flink?
    • 2. Flink与Hadoop的区别是什么?
    • 3. Flink中的事件时间(Event Time)和处理时间(Processing Time)有什么区别?
    • 4. Flink的容错机制是如何实现的?
    • 5. 什么是Flink的窗口(Window)?
    • 6. Flink支持哪些类型的窗口?
    • 7. Flink中的状态后端(State Backend)是什么?
    • 8. Flink的水印(Watermark)是什么?
    • 9. Flink的时间窗口触发器(Trigger)是什么?
    • 10. Flink与Kafka集成时如何保证事件顺序?
    • 11. Flink的处理延迟数据如何处理?
    • 12. Flink中的状态(State)是什么?
    • 13. Flink中的数据处理时间特性有哪些?
    • 14. Flink的Exactly-Once语义是如何实现的?
    • 15. Flink中的任务链(Task Chaining)是什么?
    • 16. Flink的容错机制对性能有何影响?
    • 17. Flink中的批处理和流处理有什么区别?
    • 18. Flink的窗口触发器(Trigger)有哪些类型?
    • 19. Flink支持哪些连接器(Connector)?
    • 20. Flink的状态后端(State Backend)对性能的影响如何?
    • 21. Flink的事件时间(Event Time)处理如何处理乱序事件?
    • 22. Flink的状态后端(State Backend)有哪些可选项?
    • 23. Flink如何处理流处理应用程序的版本升级?
    • 24. Flink的事件时间窗口与处理时间窗口有什么区别?
    • 25. Flink的容错机制在大规模数据处理中有何优势?
    • 26. Flink中的时间特征(Time Characteristics)有哪些选项?
    • 27. Flink的数据源(Source)可以是哪些类型?
    • 28. Flink支持哪些类型的窗口函数(Window Function)?
    • 29. Flink的广播变量(Broadcast Variable)是什么?
    • 30. Flink中的流水线并行执行(Pipeline Parallelism)是什么?
    • 31. Flink中的重启策略有哪些?
    • 32. Flink的表格API(Table API)和DataStream API有何区别?
    • 33. Flink如何处理数据倾斜(Data Skew)?
    • 34. Flink的依赖管理是如何工作的?
    • 35. Flink的Watermark机制可解决哪些问题?
    • 36. Flink的连续处理(Continuous Processing)和迭代处理(Iterative Processing)有何区别?
    • 37. Flink的UCR(Unbounded Continuous Rows)是什么?
    • 38. Flink的前后台压力(Front and Back Pressure)是什么?
    • 39. Flink的迭代(Iteration)是如何工作的?
    • 40. Flink支持哪些机器学习和图计算库?
    • 41. Flink的重启策略有哪些?
    • 42. Flink的表格API(Table API)和DataStream API有何区别?
    • 43. Flink如何处理数据倾斜(Data Skew)?
    • 44. Flink的依赖管理是如何工作的?
    • 45. Flink的Watermark机制可解决哪些问题?
    • 46. Flink的连续处理(Continuous Processing)和迭代处理(Iterative Processing)有何区别?
    • 47. Flink的UCR(Unbounded Continuous Rows)是什么?
    • 48. Flink的前后台压力(Front and Back Pressure)是什么?
    • 49. Flink的迭代(Iteration)是如何工作的?
    • 50. Flink支持哪些机器学习和图计算库?
  • 进阶篇
    • 1. Flink的并行度(Parallelism)如何设置?
    • 2. 如何降低Flink应用程序的延迟?
    • 3. Flink的容错机制如何影响性能?
    • 4. 如何避免Flink中的数据倾斜(Data Skew)?
    • 5. 如何优化Flink应用程序的内存使用?
    • 6. Flink是否支持动态调整并行度?
    • 7. Flink如何处理超大规模数据?
    • 8. Flink的状态大小对任务性能有何影响?
    • 9. 如何进行Flink应用程序的性能调优?
    • 10. Flink如何处理数据倾斜的连接操作?

基础篇

1. 什么是Apache Flink?


Apache Flink是一个开源的流处理和批处理框架,可以实现快速、可靠、可扩展的大数据处理。

2. Flink与Hadoop的区别是什么?


Flink是一个全面的流处理和批处理框架,提供了低延迟和高吞吐量的实时数据处理能力,而Hadoop更侧重于离线批处理。

3. Flink中的事件时间(Event Time)和处理时间(Processing Time)有什么区别?


事件时间是数据实际生成的时间,而处理时间是数据到达Flink系统的时间。事件时间可以通过时间戳标记数据,而处理时间是Flink根据数据到达的顺序生成的。

4. Flink的容错机制是如何实现的?


Flink使用检查点(Checkpoint)机制实现容错。它会定期保存应用程序的状态,并在发生故障时恢复到最近的一个检查点状态。

5. 什么是Flink的窗口(Window)?


窗口是Flink中用于对无限数据流进行有界处理的机制。它将无限流切分为有限的、不重叠的块,并对每个窗口进行计算。

6. Flink支持哪些类型的窗口?


Flink支持滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。

7. Flink中的状态后端(State Backend)是什么?


状态后端是Flink用于保存和管理应用程序状态的机制。它可以存储状态到内存、文件系统或分布式存储系统(如HDFS)中。

8. Flink的水印(Watermark)是什么?


水印是用于表示事件时间进度的标记。它通常与数据流中的时间戳一起使用,用于处理乱序事件和延迟数据。

9. Flink的时间窗口触发器(Trigger)是什么?


时间窗口触发器用于控制何时触发计算窗口的输出。它可以基于元素数量、处理时间、水印等条件进行触发。

10. Flink与Kafka集成时如何保证事件顺序?


可以通过使用Kafka的分区(Partition)和Flink的并行度(Parallelism)来实现事件的顺序处理和保证。

11. Flink的处理延迟数据如何处理?

处理延迟数据可以通过使用Flink的水印(Watermark)机制和事件时间(Event Time)来实现。水印可以为延迟数据提供等待时间,以便进行正确的计算。

12. Flink中的状态(State)是什么?

Flink的状态是用于在流处理和批处理中持久化保存数据的机制。它可以存储和访问计算过程中的中间结果和维护状态。

13. Flink中的数据处理时间特性有哪些?

Flink的数据处理时间特性包括事件时间(Event Time)、处理时间(Processing Time)、摄取时间(Ingestion Time)和元数据时间(Metadata Time)。

14. Flink的Exactly-Once语义是如何实现的?

Flink实现Exactly-Once语义是通过在容错检查点(Checkpoint)和幂等性操作的支持下实现的。检查点机制用于保存应用程序的状态,幂等性操作能够确保在发生故障和重启后不会产生重复的结果。

15. Flink中的任务链(Task Chaining)是什么?

任务链是将多个算子(Operators)连接在一起形成连续运行的优化技术。它将多个算子合并为一个任务,减少了数据的序列化和网络传输开销,提高了执行效率。

16. Flink的容错机制对性能有何影响?

Flink的容错机制(如检查点)可能会对性能产生一定影响,因为它需要在容错时保存和恢复状态数据。但可以通过调整检查点的频率和状态后端的选择来平衡性能和容错需求。

17. Flink中的批处理和流处理有什么区别?

Flink的批处理和流处理之间的区别在于数据到达的方式和处理模式。批处理是对有界数据集进行离线处理,而流处理是实时处理无界数据流。

18. Flink的窗口触发器(Trigger)有哪些类型?

Flink的窗口触发器包括计数触发器(Count Trigger)、处理时间触发器(Processing Time Trigger)和事件时间触发器(Event Time Trigger)等。

19. Flink支持哪些连接器(Connector)?

Flink支持与多种外部系统的连接器,如Kafka Connector、JDBC Connector、Elasticsearch Connector等,以方便与不同的数据源进行交互。

20. Flink的状态后端(State Backend)对性能的影响如何?

Flink的状态后端(如RocksDB)可以对性能产生影响,因为它涉及到IO操作和状态数据的持久化和恢复。选择适当的状态后端并合理配置参数可以平衡性能和状态存储的需求。

21. Flink的事件时间(Event Time)处理如何处理乱序事件?

Flink的事件时间处理通过水印(Watermark)机制来处理乱序事件。水印用于表示事件时间进度,通过设置适当的水印来处理可能到达的迟到事件。

22. Flink的状态后端(State Backend)有哪些可选项?

Flink的状态后端有三种常见的可选项:内存状态后端(Memory State Backend)、文件系统状态后端(File System State Backend)和RocksDB状态后端(RocksDB State Backend)。

23. Flink如何处理流处理应用程序的版本升级?

Flink通过检查点(Checkpoint)机制来处理流处理应用程序的版本升级。可以使用保存的检查点状态来保持应用程序的版本兼容性,并支持升级到新版本。

24. Flink的事件时间窗口与处理时间窗口有什么区别?

Flink的事件时间窗口是根据事件实际生成的时间来进行划分的窗口。而处理时间窗口是根据数据到达Flink系统的时间来进行划分的窗口。

25. Flink的容错机制在大规模数据处理中有何优势?

Flink的容错机制在大规模数据处理中具有较好的可伸缩性和性能。通过检查点机制实现的容错保证了任务的一致性,并且在故障发生时能够快速恢复。

26. Flink中的时间特征(Time Characteristics)有哪些选项?

Flink中的时间特征有三种选项:事件时间(Event Time)、处理时间(Processing Time)和摄取时间(Ingestion Time)。

27. Flink的数据源(Source)可以是哪些类型?

Flink的数据源可以是各种类型,如Kafka、Kinesis、RabbitMQ、文件系统等,甚至可以是自定义数据源,只需实现Flink的SourceFunction接口。

28. Flink支持哪些类型的窗口函数(Window Function)?

Flink支持常见的窗口函数,如聚合函数(sum、min、max等)、投影函数、reduce函数、处理函数等。此外,Flink还支持自定义窗口函数来实现特定的业务逻辑。

29. Flink的广播变量(Broadcast Variable)是什么?

Flink的广播变量是一种在并行计算中共享数据的机制。它可以将一个数据集广播到并行任务中,以便任务共享相同的数据集。

30. Flink中的流水线并行执行(Pipeline Parallelism)是什么?

流水线并行执行是指将多个不同算子的任务串联在一起,形成连续的任务链,从而实现更高效的执行和资源利用。通过减少数据的序列化和网络传输开销,可以获得更好的性能。

31. Flink中的重启策略有哪些?

Flink中的重启策略包括固定延迟间隔重启、失败率重启和无限重启。可以根据需求选择适当的重启策略。

32. Flink的表格API(Table API)和DataStream API有何区别?

Flink的表格API(Table API)基于SQL风格的查询语言,更适合进行关系型操作。而DataStream API是一种低级别的API,提供了更多的灵活性和对底层处理的直接控制能力。

33. Flink如何处理数据倾斜(Data Skew)?

Flink处理数据倾斜的方法包括使用键控状态(Keyed State)和重新分区(Repartition),以将算子中的数据进行均匀分布,从而缓解数据倾斜的问题。

34. Flink的依赖管理是如何工作的?

Flink的依赖管理使用Maven或Gradle作为构建工具,通过在应用程序的build文件中添加所需的依赖项来管理项目的依赖。构建工具会处理依赖项的下载和构建路径的配置。

35. Flink的Watermark机制可解决哪些问题?

Flink的Watermark机制可解决乱序事件处理和延迟数据处理的问题。通过设置适当的水印来处理乱序事件和等待延迟的数据,从而使数据处理更加准确和完整。

36. Flink的连续处理(Continuous Processing)和迭代处理(Iterative Processing)有何区别?

连续处理是对无界数据流进行实时处理,持续接收和处理数据。迭代处理是对有界数据集进行迭代计算,直到满足特定的终止条件为止。

37. Flink的UCR(Unbounded Continuous Rows)是什么?

UCR(Unbounded Continuous Rows)是Flink中一种数据结构,用于表示无界数据流,在流处理中进行操作和计算。

38. Flink的前后台压力(Front and Back Pressure)是什么?

Flink的前后台压力是指在流处理中前台和后台操作之间的流量控制机制。它通过动态调整流量来平衡速度和稳定性,防止任务因压力过大而失败。

39. Flink的迭代(Iteration)是如何工作的?

Flink的迭代是通过特殊的迭代算子和终止条件来实现迭代计算。在每次迭代中,数据会被反复处理,直到满足设定的终止条件为止。

40. Flink支持哪些机器学习和图计算库?

Flink支持与机器学习和图计算相关的库,如FlinkML、Gelly等。这些库提供了丰富的算法和工具,使Flink成为处理机器学习和图数据的强大框架。

41. Flink的重启策略有哪些?

Flink的重启策略包括固定延迟间隔重启、失败率重启和无限重启。可以根据需求选择适当的重启策略。

42. Flink的表格API(Table API)和DataStream API有何区别?

Flink的表格API(Table API)是一种基于SQL的API,更适合直观的关系型操作。而DataStream API则是更底层的API,提供了对流式数据的灵活处理能力。

43. Flink如何处理数据倾斜(Data Skew)?

Flink处理数据倾斜的方法包括使用键控状态(Keyed State)和重新分区(Repartition),以将算子中的数据分布更均匀,从而缓解数据倾斜的问题。

44. Flink的依赖管理是如何工作的?

Flink的依赖管理使用Maven或Gradle作为构建工具,通过在应用程序的构建配置文件中添加所需的依赖项来管理项目的依赖。构建工具会负责下载和管理这些依赖项。

45. Flink的Watermark机制可解决哪些问题?

Flink的Watermark机制可解决乱序事件处理和延迟数据处理的问题。通过设置适当的水印来处理乱序事件和等待延迟的数据,从而使数据处理更加准确和完整。

46. Flink的连续处理(Continuous Processing)和迭代处理(Iterative Processing)有何区别?

连续处理是对无界数据流进行实时处理,持续接收和处理数据。迭代处理是对有界数据集进行迭代计算,直到满足特定的终止条件为止。

47. Flink的UCR(Unbounded Continuous Rows)是什么?

UCR(Unbounded Continuous Rows)是Flink中一种数据结构,用于表示无界数据流,在流处理中进行操作和计算。

48. Flink的前后台压力(Front and Back Pressure)是什么?

Flink的前后台压力是指在流处理中前台和后台操作之间的流量控制机制。它通过动态调整流量来平衡速度和稳定性,防止任务因压力过大而失败。

49. Flink的迭代(Iteration)是如何工作的?

Flink的迭代是通过特殊的迭代算子和终止条件来实现迭代计算。在每次迭代中,数据会被反复处理,直到满足设定的终止条件为止。

50. Flink支持哪些机器学习和图计算库?

Flink支持与机器学习和图计算相关的库,如FlinkML和Gelly。这些库提供了丰富的算法和工具,使Flink成为处理机器学习和图数据的强大框架。

进阶篇

1. Flink的并行度(Parallelism)如何设置?

Flink的并行度可以通过设置全局并行度和算子级别的并行度来控制。全局并行度指定了整个应用程序的默认并行度,而算子级别的并行度可以对特定算子进行细粒度的控制。

2. 如何降低Flink应用程序的延迟?

降低Flink应用程序的延迟可以通过优化水印生成和事件处理逻辑来实现。例如,使用事件时间窗口来减少乱序处理的影响,调整水印生成策略以减少迟到事件的等待时间等。

3. Flink的容错机制如何影响性能?

Flink的容错机制(例如检查点)可以在故障发生时确保数据一致性和恢复能力,但在一些情况下可能对性能产生一定影响。通过调整检查点的频率和使用高效的状态后端可以在性能和容错之间取得平衡。

4. 如何避免Flink中的数据倾斜(Data Skew)?

避免Flink中的数据倾斜可以采取一些策略,如合理选择键,使用键控状态,对数据进行预分区等。有效地分散和平衡数据负载可以减轻数据倾斜的问题。

5. 如何优化Flink应用程序的内存使用?

优化Flink应用程序的内存使用可以通过配置合适的JVM参数,如堆内存和堆外内存大小,调整状态后端的配置,以及合理控制并行度和算子的内存需求来实现。

6. Flink是否支持动态调整并行度?

是的,Flink支持动态调整并行度。可以通过Flink的REST API或命令行工具来动态修改并行度,从而根据实际需求进行动态的资源分配和任务调整。

7. Flink如何处理超大规模数据?

Flink可以通过水平扩展来处理超大规模数据。可以使用Flink的流式和增量计算模型,以及分布式计算和存储技术,将任务和数据分布到多个节点上,以实现大规模数据的高效处理。

8. Flink的状态大小对任务性能有何影响?

Flink的状态大小对任务的性能有影响,较大的状态大小可能会增加序列化、传输和存储开销,影响任务的吞吐量和延迟。因此,需要合理设计和管理状态大小,以平衡性能和资源消耗。

9. 如何进行Flink应用程序的性能调优?

进行Flink应用程序的性能调优可以从多个方面入手,包括调整并行度和资源分配、优化算子链和任务链、使用异步IO和批量处理等技术手段,以及合理选择状态后端和容错机制等。

10. Flink如何处理数据倾斜的连接操作?

Flink中可以使用广播变量(Broadcast Variable)或连接预分区来处理连接操作的数据倾斜。广播变量可以将小数据集广播到所有并行任务中,而连接预分区可以将连接操作的输入数据进行预分区,以便更均匀地分布数据负载。

在这里插入图片描述

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

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

相关文章

Myelsa的Python函数之旅(高铁直达)

一、函数的定义: 函数(Function)是一段可重复使用的代码块,用于执行特定的任务或计算,并可以接受输入参数和返回输出结果。函数可以将复杂的问题分解为更小的子问题,提高代码的可读性和可维护性。 二、函数的组成: 在…

设计模式总结-适配器模式

适配器模式 模式动机模式定义模式结构适配器模式实例与解析实例一:仿生机器人实例二:加密适配器 总结 模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式。 通常情况下,客户端可以通过目标类的接口访问它所提供的…

Redis性能瓶颈与安全隐患排查验证纪实

在写《Redis怎样保证数据安全?》这篇文章,我是有对redis设置密码需要哪些步骤,设置密码的性能损耗有验证的。这就涉及到要对redis的配置做修改。 开始时我是打算采用直接使用redis配置文件的方式。所以我从redis官网下载了一个默认的配置文件…

java实现运行脚本文件

在最近的项目中,有一个需求是前端传给我一个脚本文件,然后我需要运行脚本文件后将结果进行返回,那接下来就让我们看看是怎么做的吧! public R runScripts(Integer id) {ScriptsInfo scriptsInfo this.baseMapper.selectById(id);…

影响力营销与AI的结合:Kompas.ai在搭桥角色中的独特价值

在数字化营销的新时代,影响力营销已经成为品牌建立信任和提升市场影响力的有效手段。通过与关键意见领袖(KOL)的合作,品牌能够利用KOL的信誉和影响力来扩大其市场覆盖范围和提升品牌认知度。然而,寻找与品牌价值观相契…

汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的,庆幸一直在做着有意义的事。   今天的内容,是为汇编语言课程更新一个实验项目。      本方案修改自王爽编《汇编语言》第4版P172“实验7寻址方式在结构化数据访问中的应用” …

科普|老隋分享的人力资源项目怎么样?可不可以赚钱?

近年来,随着市场竞争的加剧和企业对人才需求的不断提升,人力资源项目逐渐成为了创业者和投资者关注的焦点。老隋作为一位在人力资源领域深耕多年的专业人士,经常分享关于人力资源项目的见解和经验。那么,老隋分享的人力资源项目究…

Android Glide

1.引入glide implementation com.github.bumptech.glide:glide:4.14.2 // Skip this if you dont want to use integration libraries or configure Glide. annotationProcessor com.github.bumptech.glide:compiler:4.14.2 //Glide 注解处理器 2.AndroidManifest.xml 中添加…

截稿倒计时 CCF-B 推荐会议EGSR’24论文摘要4月9日提交

会议之眼 快讯 第35届EGSR 2024 (Eurographics Symposium on Rendering)即欧洲图形学渲染专题讨论会将于 2024 年 7月3日-5日在英国伦敦帝国理工学院举行!在EGSR之前,将有一个全新的联合研讨会,即材料外观建模(MAM)和…

【如何写论文】解决方案——删除脚注里多余的回车换行,标题的段前磅数消失问题、图像显示不完整、被截断、浮动问题

目录 一、脚注里多余的回车换行无法删除问题1.1、问题描述1.2、解决方案 二、标题前的段前磅数消失问题2.1、问题描述2.2、解决方案 三、图像显示不完整、被截断、浮动问题3.1、问题描述3.2、解决方案 一、脚注里多余的回车换行无法删除问题 1.1、问题描述 一般论文要求需要有…

Unity Toggle组件

Toggle Group组件 Allow Switch Off属性值为false时, 1,Toggle初始时默认会有一个被勾选(ison为true),可以自己打勾指定 2,不能取消勾选 Allow Switch Off属性值为true时, 1,Toggl…

无监督学习简介

无监督学习简介 一、定义和核心概念 无监督学习的定义 无监督学习是机器学习的一个关键分支,它涉及到从未标注数据中学习和提取信息。不同于其他学习类型,无监督学习的数据集没有提供任何显式的输出标签或结果。因此,这种学习方法的主要任务…

js计算器实现

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 给每个按钮添加点击事件&#xff0c;使用eval()进行计算。 3. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&q…

数据生成 | Matlab实现基于DE差分进化算法的数据生成

数据生成 | Matlab实现基于DE差分进化算法的数据生成 目录 数据生成 | Matlab实现基于DE差分进化算法的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于DE差分进化算法的数据生成&#xff0c;运行环境Matlab2021b及以上&#xff1b; 2.计…

HubSpot如何通过自动化和优化客户服务流程,提升客户满意度和忠诚度?

HubSpot通过自动化和优化客户服务流程&#xff0c;可以有效地提升客户满意度和忠诚度。以下是HubSpot实现这一目标的几个关键步骤&#xff1a; 建立清晰的服务流程&#xff1a;首先&#xff0c;HubSpot帮助企业建立清晰、标准化的客户服务流程。这包括明确的服务阶段定义&…

Codigger Desktop:用户体验与获得收益双赢的革新之作(一)

上周&#xff0c;我们介绍了Codigger Desktop凭借其强大的功能、稳定的性能以及人性化的设计&#xff0c;成为了广大开发者的得力助手。Codigger Desktop除了是开发者的利器外&#xff0c;它以其出色的用户体验和创新的收益模式&#xff0c;为用户提供了一个全新的选择。Codigg…

【线段树】1622. 奇妙序列

本文涉及知识点 设计 数学 线段树 本文基础解法 【设计】 【数学】1622 奇妙序列 LeetCode1622. 奇妙序列 请你实现三个 API append&#xff0c;addAll 和 multAll 来实现奇妙序列。 请实现 Fancy 类 &#xff1a; Fancy() 初始化一个空序列对象。 void append(val) 将整数…

【单片机家电产品--晶闸管(可控硅)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–晶闸管 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1 晶体管和晶闸管之间的区别 晶体管和晶闸管之间的区别 2 什么是可控硅&#xf…

WebKit结构揭秘:探秘网页渲染的魔法之源

一、WebKit之心&#xff1a;渲染引擎的魔力 WebKit的渲染引擎是其核心所在&#xff0c;它犹如一位技艺高超的魔法师&#xff0c;将HTML、CSS和JavaScript的魔法咒语转化为绚丽的网页画面。它解析代码&#xff0c;绘制页面&#xff0c;让网页内容跃然屏上&#xff0c;展现出无尽…

宏的使用(C语言详解)

在写一个代码生成可执行文件的过程需要经过编译和链接&#xff0c;编译又要经过三部&#xff1a;预处理&#xff0c;编译&#xff0c;汇编。 #define定义的变量和宏就是在预处理阶段会处理的。 一个简单的宏定义&#xff1a; #include<stdio.h>; #define Max(a,b) a>…