三元运算符和宏#define

问题描述 投票:0回答:1

如果在宏中使用三元运算符,我会感到困惑。为什么输出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);
}
c macros ternary
1个回答
2
投票

当您对宏的用法感到困惑时,请将其复制粘贴到正在使用的位置并从那里进行评估:

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


© www.soinside.com 2019 - 2024. All rights reserved.