【问题标题】:ternary operator without else in CC中没有其他的三元运算符
【发布时间】:2012-08-28 22:52:51
【问题描述】:

我想在 C 中使用三元运算符而不使用 else。我该怎么做。

(a)? b: nothing;

类似的东西。我什么都没用?

【问题讨论】:

  • 如果您不打算使用 else,为什么要使用三元运算符。它失去了它的目的。
  • 我遇到了与 op 相同的问题,cout << ((isNegative) ? '-') << number 将是一个完美的例子,说明当某个条件为真时您想要一个额外的字符,而 else 不能是 '',因为一个字符不能为空。
  • 它是什么意思,你想在什么情况下使用它?
  • @user5887651 我想可以使用(isNegative ? (cout<<',') : cout) << number;...

标签: c operator-keyword if-statement ternary


【解决方案1】:

如果您使用的是这样的三元运算符,大概可以替换为:

if (a) { b; }

这是很多,很多更好。 (意图更清晰,所以代码更容易阅读,不会有性能损失。)

但是,如果您使用三元运算符作为表达式,即

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);

a = b*c + (d == 0 ? 1 : <nothing>);

那么&lt;nothing&gt; 的值取决于它所使用的上下文。在我的第一个例子中,&lt;nothing&gt; 应该是"",而在第二个例子中它应该是0

【讨论】:

  • 假设我需要根据条件调用其他宏,最后一个 else 部分什么都不做,我可以写如下内容吗(假设 A、B、C 在其他地方定义):#define setValue(inp) ( inp==A)?macro1():(inp==B)?macro2():(inp==C)?macro3():0。但是,如果 0 是其他宏的有效返回值,我们可能会遇到问题。
  • @JonWheelock:只需使用多行宏和if 语句
【解决方案2】:

省略的假表达式无效。请尝试反转条件。

(!a) ?: b;

【讨论】:

  • 请注意,没有第二个操作数的 ?: 是 GNU 扩展。语义可能无法提供问题的答案,因为如果非 false 将使用第一个操作数 (!a) 的值,否则将使用第三个操作数 (b) 的值。由于!,如果a 为假,则始终为true(技术上非零值),而OP 想要“无”。
【解决方案3】:

if-else 是一个控制流构造,而?: 是一个运算符,x ? y : z 是一个表达式——表达式不能有“无值”,而控制流可以有一个“什么都不做的路径”。 if-else 和 ?: 之间没有真正的等价关系 - 它们并非在所有情况下都可以互换。

您可以在某些情况下达到您想要的效果,但使用if 而不使用else 可能效率较低。比如效果:

if( x )
{
    y = z ;
}

可以通过以下方式实现:

y = x ? z : y ;

但是当 x 为 false 时,有一个有效但多余的 else y = y 分配,您的编译器可能会或可能不会优化。所以你可以达到效果,但前提是你知道“当前值”作为?:表达式结果返回。

【讨论】:

    【解决方案4】:

    您不能省略 else 部分。只需使用 none 表达式。

    但是,在这种情况下,最好使用if...

    【讨论】:

    • 您好,感谢您的回复。它现在符合。我理解 0 但不明白 (void) 向编译器表明什么?
    • 这需要b 也是void 类型。
    • 我认为三元运算符比 if 条件更快?我错了吗?
    • @user437777,if 和三元可能被编译成相同的代码。
    • 基准测试?这取决于具体情况和优化级别。
    【解决方案5】:

    我尝试将任何整数放在那里,效果很好。例如,如果你想返回“a”,如果它被评估为真,那么你可以这样写:

    true ? a : 1;
    

    【讨论】:

      【解决方案6】:

      似乎这个问题已经存在了一段时间,但 FWIW 一个用 GCC 4.6.3 编译的简短 C 程序揭示了以下内容:

      1. 以下内容无法编译:a = a ? b:;。 “错误:';' 标记之前的预期表达式”。
      2. 以下是等效的:a = a ?: b;a = a ? a : b;

      也许有人可以添加更多编译器方面的细节,但在我看来,省略 true 执行路径只是很花哨。

      【讨论】:

        【解决方案7】:

        我做了这个

        isLeapYear(i) ? cout&lt;&lt; i&lt;&lt;endl: cout&lt;&lt;"" ;

        但不确定,这是否会影响性能。

        【讨论】:

          【解决方案8】:

          三元表达式基于从布尔条件派生的语句。如果一条语句被标记为void(),那么正如您所料,什么都不会发生。

          C++ 代码:

          condition ? add(value) : void();
          

          C 代码:

          condition ? add(value) : 0;
          

          【讨论】:

            【解决方案9】:

            试试这个

            BOOL bIsOK = (a == 5)?TRUE:FALSE;
            

            【讨论】:

            • 认真的吗?这与问题完全无关。
            • .. 即使它是相关的,它也等同于 BOOL blsOK = (a==5) ;
            猜你喜欢
            • 2022-09-29
            • 1970-01-01
            • 2011-02-15
            • 2021-10-25
            • 2011-02-25
            • 2011-03-16
            • 1970-01-01
            相关资源
            最近更新 更多