将函数定义为宏的疑问:分析含do-while(1)的MAX宏代码
这段迷惑性C宏代码的解析
关于do { ... } while(1)无限循环的问题
首先得说,这个宏的名字MAX纯纯是误导——它和“最大值”“区间”半毛钱关系都没有。展开后的逻辑是:如果第一个参数i小于limit,就把i加1,然后直接进入无限死循环(因为while(1)的条件永远为真)。
而且你代码里main里调用MAX(0,3)本身就有问题:宏展开后会尝试对字面量0做自增操作(0++),这在C里是非法的,字面量不能被修改。就算你传的是变量,比如int x=0; MAX(x,3);,程序也会先把x改成1,然后卡死在无限循环里。
正常情况下,宏里用do { ... } while(0)是为了让宏能像普通语句一样在各种场景下正确执行,但这里用while(1)要么是写代码的人搞恶作剧,要么是完全错误的写法,没有任何合理的实际用途。
为什么存返回值会编译报错
do { ... } while(...)是C语言里的语句,不是表达式,它没有返回值。你试图把它的结果赋值给变量,就跟写int a = for(;;);或者int b = if(1){};一样,编译器肯定会报错“expected an expression”——因为赋值运算符右边必须是能产生值的表达式,而不是一个单纯的语句。
这个宏展开后就是一个do-while语句,所以它根本不能用来赋值,自然没法把“返回值”存到变量里。
内容的提问来源于stack exchange,提问作者Tau TV
相关产品推荐
相关产品推荐

