You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言使用#define定义max类函数宏后代码输出5的原因是什么

结果产生原理

首先你要明确C语言的类函数宏是预编译阶段的纯文本替换,不会像普通函数一样先计算完参数值再传入,而是直接把你写的参数原文代入到宏定义的位置。

你给出的代码里,max(++i,++j) 经过预编译替换后,实际展开的代码等效于:

k = (++i > ++j ? ++i : ++j);

接下来按顺序执行逻辑:

  • 初始值:i=2,j=3
  • 先计算三元运算符的判断条件++i > ++j:
    1. 执行++i,i自增为3
    2. 执行++j,j自增为4
    3. 3>4的判断结果为假,所以取冒号后面的++j执行
  • 第二次执行++j,j自增为5,赋值给k

所以最终printf输出的k值就是5。

这也是类函数宏最常见的坑:如果参数带副作用(比如自增、自减、函数调用),会因为多次展开被执行多次,和普通函数的行为完全不同,写宏的时候要特别注意规避这类问题。

内容的提问来源于stack exchange,提问作者Md Masuduzzaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:42:04