6

我有一个程序流程如下:

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

我需要将其转换为条件表达式,这就是我所做的:

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

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

4

4 回答 4

15

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

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
于 2013-02-27T14:00:36.463 回答
3

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

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);

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

于 2013-02-27T14:28:47.593 回答
3

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

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

于 2013-02-27T14:00:28.093 回答
1

C 三元运算符优先级和关联的设计允许这样做:

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

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

于 2020-11-30T17:22:00.060 回答