多语句三元运算符

8
我有一个程序流程如下:
if(a)
{
    if((a > b) || (a > c))
    {
        doSomething();
    }
    statementX;
    statementY;
}

我需要将这个表达式转化为条件表达式,以下是我的处理结果:
(a) ? (((a > b) || (a > c)) ? doSomething() : something_else) : something_else;

我应该在哪里插入语句statementX和statementY?因为它们需要在两种可能情况下执行,所以我真的找不到方法。


11
为什么?以第一种方式书写更易于阅读! - Joe
你的 if 语句没有 else,因此使用三元运算符并不适合这个问题。 - us2012
尽管我已经准备好使用三元运算符的简洁性,但我很少使用它 - 正如Joe所提到的,它会影响可读性。 - ppeterka
1
此外,您不能将语句视为表达式,因此甚至会收到编译器错误。 - user529758
1
谁给了你这样的“任务”? - Happy Green Kid Naps
显示剩余2条评论
4个回答

17
您可以像这样使用逗号运算符:
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()条件。对于任何其他可能遇到该代码片段的人来说,这种方式也更易读。

将某些内容变成单行可能看起来很好,但从可读性的角度来看,这并不值得(没有性能提升)。


4
你可以使用嵌套的三目运算符语句。
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);

显而易见的优势是可以减少给定逻辑的代码行数,但同时也会降低代码的可读性。

简单而精确。谢谢。 - user2053912

2
C三元运算符的优先级和结合性是为了允许这样做:
return c1 ? v1 :
       c2 ? v2 :
       c3 ? v3 :
       c4 ? v4 :
       vdefault;

由于 == != >= <= < >, &&, ||, ^^ 操作符的优先级高于三元操作符,因此括号不是必需的。


我似乎记得我曾经使用过一些语言,其中运算符优先级规则意味着你不能像这样堆叠三元表达式而不增加括号的层数。很高兴知道C语言没有这个问题。 - thomasrutter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接