三元C运算符如何解释空的第一分支?为什么?

三元C运算符如何解释空的第一分支?为什么?,c,gcc,ternary-operator,conditional-operator,C,Gcc,Ternary Operator,Conditional Operator,使用gcc-Wall(4.9.2)似乎可以在没有警告的情况下编译和运行 #包括 int main(int argc,字符**argv){ printf(“%d\n”,argc-1?:42); 返回0; } 如果我运行它 使用0个参数(使argc-1计算为false),它打印42 当n>=1个参数时(使argc-1计算为true),它打印n-1 如果我假设x?:y在本例中等同于x?1:y,对吗?这是标准的、预期的行为,还是只是GCC的一个怪癖?这是已知的条件运算符的速记版本 argc-1?

使用
gcc-Wall
(4.9.2)似乎可以在没有警告的情况下编译和运行

#包括
int main(int argc,字符**argv){
printf(“%d\n”,argc-1?:42);
返回0;
}
如果我运行它

  • 使用0个参数(使
    argc-1
    计算为
    false
    ),它打印
    42
  • 当n>=1个参数时(使
    argc-1
    计算为
    true
    ),它打印n-1
如果我假设
x?:y
在本例中等同于
x?1:y
,对吗?这是标准的、预期的行为,还是只是GCC的一个怪癖?

这是已知的条件运算符的速记版本

 argc-1?:42
就跟

(argc-1)?(argc-1):42
使用此变体的原因是(我引用)

当它变得有用时,当第一个操作数,或者(如果它是一个宏参数),包含副作用。然后在中间重复操作数将执行副作用两次。省略中间操作数使用已经计算的值,而不需要重新计算它。
但是如果程序运行时没有参数
argc
将为1,那么程序应该返回
0
而不是
1
,没有挑剔:这是相同的,只是用作条件和第一个操作数的表达式只计算一次。@ibi0tux那么你的意思是,条件将为真?“这是怎么回事?”昆汀扩展了答案。哎哟——我发现这是个骗局,但为时已晚。我四处搜索,诚实地说,“有1个或多个参数(使argc-1的计算结果为真),它会打印1“不,它不会,它会打印
(argc-1)
,例如,它打印4个参数,它打印42个参数。因为
(argc-1)
int
而不是布尔值。
(argc-1)?(argc-1):42