一些常用define

#define rep(a,b,c) for (int a=b;a<=c;a++)
#define per(a,b,c) for (int a=b;a>=c;a--)
#define go(u) for (int o=ft[u],v;v=E[o].t,o;o=E[o].n) // forEdge
#define fi first
#define se second // pair
#define hav(s,p) (s>>(p-1)&1)
#define ins(s,p) (s|1<<(p-1))
#define del(s,p) (s^1<<(p-1)) // state compression
<think>我们正在讨论C语言中的#define预处理指令。根据用户提供的引用和问题,用户希望理解#define语句的作用和常用功能。下面我将结合引用内容进行详细解释。 引用[1]提到:#define定义一个标识符来表示一个常量,其特点是定义的标识符不占内存,预编译后符号就不存在了。格式为#define 标识符 常量(注意没有分号)。它通常写在函数外部,作用域从定义行到文件结束,可以用#undef终止。 引用[2]给出了一个简单示例:用#define M 1000定义标识符M,然后在main函数中使用。 引用[3]展示了多种常量定义:整型、字符串、浮点数。 引用[4]补充说明#define是预处理指令,可以定义宏,并提到多行定义时可用反斜杠换行。 综合以上,我们可以将#define的功能分为两类:定义标识符常量(无参宏)和定义宏函数(有参宏)。用户问题中主要关注标识符常量,但为了完整性,我会简要提及宏函数。 回答结构: 1. 基本作用:解释#define的本质(预处理替换) 2. 常用功能一:定义常量(重点) 3. 常用功能二:定义宏函数(简要) 4. 注意事项 5. 示例代码 6. 相关问题 注意:用户要求使用LaTeX公式(如数学表达式)和独立公式,但本主题主要涉及代码,数学公式较少。不过我们可以在解释宏函数时使用简单公式示例。 最后生成相关问题。</think>### C语言 `#define` 语句的作用与常用功能 `#define` 是 C 语言的**预处理指令**,用于在编译前进行文本替换。它不占用内存空间,预编译后符号即消失[^1][^4]。核心功能如下: --- #### 一、核心作用 1. **定义常量** 用标识符替代常量值,提高代码可读性和可维护性[^1][^3]: ```c #define PI 3.1415926 // 定义圆周率 #define MAX_SIZE 100 // 定义数组最大长度 ``` - **优势**: - 修改常量只需调整 `#define` 处(例如修改 `MAX_SIZE` 为 200) - 避免魔法数字(如直接使用 `100`) 2. **定义字符串常量** ```c #define WELCOME_MSG "Hello, World!" // 定义字符串[^3] ``` --- #### 二、高级用法:宏函数 通过参数实现简单函数功能(**无类型检查**): ```c #define SQUARE(x) ((x) * (x)) // 计算平方 #define MAX(a, b) ((a) > (b) ? (a) : (b)) // 取最大值 ``` **示例**: ```c int num = SQUARE(5); // 替换为 ((5) * (5)) → 25 int max_val = MAX(3, 8); // 替换为 ((3) > (8) ? (3) : (8)) → 8 ``` > ⚠️ **注意事项**: > - **括号必要性**:`#define SQUARE(x) x * x` 调用 `SQUARE(1+2)` 会展开为 `1+2*1+2=5`(错误),正确写法为 `((x)*(x))`[^4]。 > - **避免副作用**:`MAX(a++, b++)` 可能导致变量多次自增。 > - **多行宏**:用 `\` 连接: > ```c > #define LOG(msg) \ > printf("[INFO] %s\n", msg); \ > fflush(stdout) > ``` --- #### 三、作用域与规则 1. **作用域**: - 从定义处到文件结束,或遇到 `#undef 标识符` 终止[^1]。 2. **书写规范**: - 通常与 `#include` 一起写在文件顶部(函数外)[^1]。 3. **注释支持**: - 可在行内添加标准 C 注释[^4]。 --- #### 四、典型示例 ```c #include <stdio.h> #define PI 3.1415926 #define CIRCLE_AREA(r) (PI * (r) * (r)) // 计算圆面积 int main() { double radius = 5.0; double area = CIRCLE_AREA(radius); printf("Area: %.2f\n", area); // 输出 Area: 78.54 return 0; } ``` --- ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值