欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > C语言 ——— 带副作用的宏参数

C语言 ——— 带副作用的宏参数

2024/10/23 23:24:52 来源:https://blog.csdn.net/weixin_55341642/article/details/141992456  浏览:    关键词:C语言 ——— 带副作用的宏参数

目录

带有副作用的代码

带有副作用的宏参数

 结论


带有副作用的代码

代码演示:

int a = 10;int b = ++a;

副作用解析:

变量 a 在赋值给 b 之前 a 的值自增了1,那么 int b = ++a; 这条代码就带有副作用


带有副作用的宏参数

代码演示:

#define MAX(x,y) ((x)>(y)?(x):(y))int main()
{int a = 5;int b = 6;int max = MAX(a++, b++);return 0;
}

代码解析:

解析 int max = MAX(a++, b++):根据 #define 的替换规则可得知,a++ 和 b++ 这两个参数是直接替换的,不会进行任何计算和转换,所以 MAX(a++, b++) 在程序预编译阶段就会转换为以下代码

int max = ((a++) > (b++) ? (a++) : (b++));

先执行 (a++) > (b++)  ,且是后置加加,所以是先使用,再加加,a 的值是 5,b 的值是 6,是 b 大于 a

所以 (a++) : (b++) 中的 (a++) 就不会执行,执行完了 (a++) > (b++) 后,a 的值自增成了 6 ,b 的值自增成了 7

最后的结果是 max = (b++) ,也是先使用,后加加,b 的值为 7,所以 max 就为 7

最后 b 再自增 1,b就自增成了 8

代码验证:


 结论

任何变量在宏中都是替换进去的,如果变量像是 a++ 或者 b++ 这种带有副作用,且在宏中不止执行一次的话,那么副作用的效果就会持续传递下去,所以尽量不要传递含有副作用的参数给宏

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com