【问题标题】:Ternary operator with multiple statements具有多个语句的三元运算符
【发布时间】:2013-02-13 08:48:03
【问题描述】:

我有一个程序流程如下:

if(a)
{
    if((a > b) || (a > c))
    {
        doSomething();
    }
    statementX;
    statementY;
}

我需要把它翻译成条件表达式,这就是我所做的:

(a) ? (((a > b) || (a > c)) ? doSomething() : something_else) : something_else;

在哪里插入语句 statementX、statementY?由于在这两种可能的情况下都需要执行,我真的找不到办法。

【问题讨论】:

  • 为什么?我觉得它的第一种形式更具可读性!..
  • 您的ifs 没有elses,因此为此使用三元运算符并不适合该问题。
  • 尽管我已经为三元运算符的简洁特性做好了充分准备,但我很少使用它——正如 Joe 所说,它会限制可读性。
  • 另外,你不能把语句当作表达式,所以你甚至会得到一个编译器错误。
  • 谁给你这样的“任务”?

标签: c if-statement ternary-operator


【解决方案1】:

C 三元运算符的优先级和关联是为了实现这一点而设计的:

return c1 ? v1 :
       c2 ? v2 :
       c3 ? v3 :
       c4 ? v4 :
       vdefault;

由于 == != >= , &&, ||, ^^ 运算符的优先级高于三元运算符,由于三元运算符本身,不需要括号。

【讨论】:

  • 我似乎记得我曾经使用过运算符优先级规则意味着在不增加括号级别的情况下无法堆叠这样的三元表达式的语言。很高兴知道 C 没有。
【解决方案2】:

您可以使用嵌套的三元运算符语句

if(a)
{
if((a > b) || (a > c))
{
    printf("\nDo something\n");
}
printf("\nstatement X goes here\n");
printf("\nstatement X goes here\n");
}

以上代码,可替换为

(a) ? (   ( a>b || a>c )? printf("\nDo something\n");  :  printf("\nstatement X goes here\n");printf("\nstatement Y goes here\n");  )   : exit (0);

这里的明显优势是能够减少给定逻辑的代码行数,但同时也降低了代码的可读性。

【讨论】:

  • 简单而精确。谢谢。
【解决方案3】:

您可以像这样使用逗号, 运算符:

a ? (
    (a > b || a > c ? do_something : do_something_else), 
    statementX, 
    statementY
  ) 
  : something_else;

以下程序:

#include <stdio.h>

int main ()
{
    int a, b, c;

    a = 1, b = 0, c = 0;

    a ? (
      (a > b || a > c ? printf ("foo\n") : printf ("bar\n")),
      printf ("x\n"),
      printf ("y\n")
    )
    : printf ("foobar\n");
}

为我打印:

foo
x
y

【讨论】:

    【解决方案4】:

    考虑到您正在执行语句而不是分配,我会坚持使用if() 条件。对于可能遇到那段代码的其他人来说,它也可以说更具可读性。

    将某些东西写成单行可能看起来不错,但就失去可读性而言,这是不值得的(没有性能提升)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多