#define MIN(A,B) ((A) <= (B) ? (A) : (B))
#define MIN(A,B) (A) <= (B) ? (A) : (B) #define MIN(A,B) (A <= B ? A : B )
((*p++) <= (b) ? (*p++) : (b))
#define MIN(A,B) ((A) <= (B) ? (A) : (B));
least = MIN(*p++, b);
least = ((*p++) < b) ? (*p++) : (b)
宏整个表达式和参数都要加括号,因为是字符串替换
宏后没分号
宏中参数不能有自加等操作
应该是自增和自减的副作用,而不是宏的,宏只会照定义在使用处替换,相当于依葫芦拷贝。
C中以一个分号以及while中的判断语句为一个完整的表示式,如果一个表达式中某个变量自增出现2次,C只会保证在整个表达式结束后该变量会增加2次,而在执行中是否增加或者什么时候增加都是不确定的。
#define MIN(m,n) ((m)<(n) ? (m):(n))
#define ((A)?(B):A,B)
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
MIN(*p++, b)会产生宏的副作用
剖析:
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。
程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
都应判0分;
(2)防止宏的副作用。
宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。