三元运算符和宏#define

Ternary Operators and Macros #define

如果在宏中使用,我对三元运算符的输出感到困惑。为什么输出是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 为真,则 return 0,否则 return 表达式 (2+2) / 2.由于 ! 2 为假,表达式 2+2 / 2 被 returned,其结果显然是 3


第二个 printf 调用的第二个参数是:如果 ! -1 - 1 为真,则 return 0,否则 return 表达式 4 / -1 - 1.

表达式 ! -1 -1 实际上被解释为 !(-1) - 1,因为 !(逻辑非)运算符优先于 -(减法)运算符。

!(-1) 变为 0-1 是一个真值,当取反时,它变成一个假值,即 0)。

0 - 1变为-1,为真值,因此三元运算符的真值为return,即0.