【问题标题】:How does the ternary C operator interpret an empty 1st branch? Why? [duplicate]三元 C 运算符如何解释空的第一个分支?为什么? [复制]
【发布时间】:2016-07-28 11:27:07
【问题描述】:

这似乎使用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>=1 args(使 argc-1 评估为 true),它会打印 n-1。

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

【问题讨论】:

  • 哎哟——我发现这是一个骗局,但为时已晚。老实说,我四处寻找。
  • " 1 或更多(使 argc-1 评估为真),它打印 1" 不,它没有,它打印 (argc-1),例如4 个参数输出 4,42 个参数输出 42。因为 (argc-1)int 不是布尔值。

标签: c gcc conditional-operator


【解决方案1】:

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

 argc-1?:42

一样
(argc-1)?(argc-1):42

使用这种变体的原因是(我引用)

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

【讨论】:

  • 但是程序在没有参数的情况下运行argc会是1,那么程序应该返回0而不是1,不是吗?
  • Nitpick :它是一样的,除了用作条件和第一个操作数的表达式只计算一次。
  • @ibi0tux 所以你的意思是说,那么条件会是真的吗?怎么样?
  • @Quentin 扩展了答案。
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2018-03-16
  • 2015-12-09
  • 1970-01-01
  • 2017-05-15
  • 2011-05-08
相关资源
最近更新 更多