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

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) {// 某些代码
}

总结

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

http://www.xdnf.cn/news/1451.html

相关文章:

  • 璞华ChatBI闪耀2025数博会:对话式数据分析引领数智化转型新范式
  • BM1684X+FPGA+GMSL视觉解决方案:驱动工业智能化升级的核心引擎
  • 卷积神经网络常用结构
  • 第一章:基于Docker环境快速搭建LangChain框架的智能对话系统:从langchain环境搭建到多轮对话代码实现(大语言模型加载)
  • 读书笔记:淘宝十年产品与技术演进史
  • 第一篇:Django简介
  • java将pdf转换成word
  • 中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
  • 学习设计模式《五》——工厂方法模式
  • JavaScript-防抖和节流
  • 工业相机中CCM使能参数-色彩校正矩阵
  • 【SpringCloud】Gateway
  • JavaFX 第一篇 Hello World
  • 《让机器人读懂你的心:情感分析技术融合奥秘》
  • Java 中实现 Oracle 分页查询
  • CS144 Lab3 实战记录:TCP 发送器实现
  • [蓝桥杯 2025 省 Python B] 异或和
  • 2025-04-23 Python深度学习3——Tensor
  • 设计模式之策略模式
  • 富文本编辑器实现
  • C++ STL 容器简介(蓝桥杯适用精简版)
  • 解决报错:this[kHandle] = new _Hash(algorithm, xofLen);
  • Java面试题汇总
  • CSS-跟随图片变化的背景色
  • 【Java学习笔记】选择结构
  • 4月23日作业
  • 聊聊自动化用例的维护
  • Java 实现单链表翻转(附详细注释)
  • PH传感器详解(STM32)
  • 配置kafka与spark连接