三元C算子如何解释空的第一个分支?为什么呢?

时间:2016-04-07 14:03:44

标签: c gcc ternary-operator conditional-operator

这似乎是使用gcc -Wall(4.9.2)

编译并运行而没有警告
#include <stdio.h>
int main(int argc, char **argv){
    printf("%d\n", argc-1?:42);
    return 0;
}

如果我运行它

  • 带有0个参数(使argc-1评估为false),它会打印42;
  • 使用n&gt; = 1 args(使argc-1评估为true),它会输出n-1。

如果我认为x?:y在这种情况下等同于x?1:y,我是对的吗?这是标准的,预期的行为,还是只是GCC的怪癖?

1 个答案:

答案 0 :(得分:5)

对于条件运算符的简写版本,这是一个已知的gcc extension

 argc-1?:42

相同
(argc-1)?(argc-1):42

使用此变体的原因是(和我引用)

  

“当它变得有用时是第一个操作数,或者可能(如果它是一个宏参数),包含副作用。然后在中间重复操作数将执行两次副作用。省略中间操作数使用已经计算的值而没有重新计算它的不良影响。“