如果在宏中使用三元运算符,我会感到困惑。为什么输出3和0?
#define test(x,y)(! y ? 0 : x/y)
int main(void){
printf("%d",test(2+2,2));
printf("%d",test(4,-1-1));
return(0);
}
当您对宏的用法感到困惑时,请将其复制粘贴到正在使用的位置并从那里进行评估:
int main(void){
printf("%d", ! 2 ? 0 : 2+2 / 2);
printf("%d", ! -1 - 1 ? 0 : 4 / -1 - 1);
return(0);
}
第一个printf
调用的第二个参数为:如果! 2
为true,则返回0
,否则返回表达式(2+2) / 2
。由于! 2
为假,因此返回表达式2+2 / 2
,其结果显然为3
。
第二个printf
调用的第二个参数为:如果! -1 - 1
为true,则返回0
,否则返回表达式4 / -1 - 1
。
! -1 -1
表达式实际上被解释为!(-1) - 1
,因为!
(逻辑非)运算符的优先级高于-
(减法)运算符。
!(-1)
变为0
(-1
是真实值,如果取反,它将成为伪造的值,即0
)。
然后,0 - 1
变为-1
,这是一个真实值,因此返回三元运算符的真实值,即0
。