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

c语言之杂识

前言

主要说一下c语言的杂知识


一、预处理指令

1. #include

#include指令用于包含其他头文件的内容到当前文件中。这允许您在程序中使用其他模块定义的函数和变量。

示例:

#include <stdio.h>  // 包含标准输入输出头文件int main() {printf("Hello, World!\n");return 0;
}

2. #define

#define指令用于定义宏,可以简化代码中的重复内容,或者定义常量。

示例:

#define PI 3.14159int main() {double radius = 5.0;double area = PI * radius * radius;printf("Area of circle: %f\n", area);return 0;
}

3. #ifdef#ifndef#else#endif

条件编译指令用于根据条件选择性地包含或排除代码段。

示例:

#define DEBUGint main() {#ifdef DEBUGprintf("Debug mode is enabled\n");#elseprintf("Debug mode is disabled\n");#endifreturn 0;
}

4. #if#elif#else#endif

条件编译指令根据表达式的值确定代码是否被包含。

示例:

#define VERSION 2#if VERSION == 1// Code for version 1printf("This is version 1\n");
#elif VERSION == 2// Code for version 2printf("This is version 2\n");
#else// Default codeprintf("Unknown version\n");
#endif

5. #undef

#undef指令用于取消已定义的宏。

示例:

#define MESSAGE "Hello, World!"int main() {printf("%s\n", MESSAGE);#undef MESSAGE// printf("%s\n", MESSAGE);  // This will cause a compilation errorreturn 0;
}

二、宏和函数的区别

1. 宏(Macro)

  • 宏是预处理器的一种指令,用于在编译之前对代码进行文本替换。
  • 宏定义中通常不需要指定参数类型,直接进行文本替换,不进行类型检查。
  • 宏没有函数调用的开销,但执行时会展开成实际的代码,可能导致代码体积增大。
  • 宏可以包含复杂代码,包括多条语句、条件判断等。
  • 宏的作用域是全局的,可以在任何地方使用。

示例:

#define SQUARE(x) ((x) * (x))
int result = SQUARE(5); // 展开后为:int result = ((5) * (5));

2. 函数(Function)

  • 函数是一段封装了一定功能的代码块,可以被调用执行。
  • 函数需要定义参数类型,编译器进行参数类型检查。
  • 函数调用时有一定的开销,包括参数传递、压栈等。
  • 函数体内的代码可以被多次调用,提高代码的可重用性。
  • 函数的作用域限定在定义函数的源文件或外部声明范围内。

示例:

int square(int x) {return x * x;
}
int result = square(5);

区别总结:

  • 宏是编译时处理,函数是运行时处理。
  • 宏替换是简单的文本替换,函数调用会有额外的处理步骤。
  • 宏适用于简单的代码替换,函数适用于封装一定功能的代码块。
  • 宏定义不进行参数类型检查,函数需要定义参数类型。
  • 宏可以包含条件判断、循环等,函数更适合复杂的逻辑处理。

三、typedef

  • typedef关键字用于给现有的数据类型取一个新的别名。
  • 通过typedef可以为现有的数据类型定义一个新的名称,提高代码的可读性和可维护性。
  • typedef还可以用于定义复杂的结构体和枚举类型。
  • 通过typedef定义的别名,在后续代码中可以像原始类型一样使用。

示例:

typedef int Integer; // Integer 是 int 的别名
Integer num = 10;
四. volatile
  • volatile是一个类型修饰符,告诉编译器该变量可以随时发生改变,编译器不应该对其进行优化。
  • 用volatile修饰的变量,编译器每次访问该变量都会从内存中读取,而不会使用寄存器中的值。
  • volatile通常用于多线程编程、中断处理等需要避免编译器优化的场景。
  • volatile的使用能够确保代码在特定情况下不会受到编译器的优化影响。

示例:

volatile int flag = 0; // flag 变量被定义为 volatile
while(volatile_flag == 0) {// 某些代码
}

总结

关于本篇的内容就结束了,对你有帮助的可以点个赞

相关文章:

  • 安装jdk报错2503、2502--右键msi文件没法管理员权限执行(Windows解决方案)
  • 使用Handsontable实现动态表格和下载表格
  • 基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告
  • DIY钢铁侠方舟反应堆第二期—第一代电路板展示
  • 【Hive入门】Hive基础操作与SQL语法:DDL操作全面指南
  • chrony服务器
  • 路由交换实验-手动聚合与LACP
  • Python爬虫学习:高校数据爬取与可视化
  • AIGC的商业化路径:哪些公司正在领跑赛道?
  • 页面滚动锚点也滚动-封装了一个ts方法(定位锚点跟随页面滚动下滑)
  • 前端渲染pdf文件解决方案-pdf.js
  • 工具指南:免费将 PDF 转换为 Word 的 10 个工具
  • MIT IDSS深度解析:跨学科融合与系统科学实践
  • 【白雪讲堂】GEO优化第7篇 -构建《推荐类》内容的结构化模板
  • 代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III
  • YOLO学习笔记 | 从YOLOv5到YOLOv11:技术演进与核心改进
  • 搭建 Stable Diffusion 图像生成系统并通过 Ngrok 暴露到公网(实现本地系统网络访问)——项目记录
  • 基于esp32-s3,写一个实现json键值对数据创建和读写解析c例程
  • HCIA-Access V2.5_18_网络管理基础_1_网络管理系统架构
  • 【AI】Trae的MCP配置及使用测试
  • 为什么猛起身会头晕?你的身体在发出这个警报
  • 中美正在就关税问题谈判甚至会达成协议?外交部:都是假消息
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 北京潮白河大桥发生火情:部分桥体受损,现场已双向断路
  • 创单次出舱活动时长世界纪录,一组数据盘点神十九乘组工作成果
  • 印控克什米尔地区发生针对游客枪击事件,造成至少25人丧生