三元运算符和宏#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
.
如果在宏中使用,我对三元运算符的输出感到困惑。为什么输出是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
.