Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多语句三值运算符_C_If Statement_Ternary Operator - Fatal编程技术网

C 多语句三值运算符

C 多语句三值运算符,c,if-statement,ternary-operator,C,If Statement,Ternary Operator,我有一个程序流程如下: if(a) { if((a > b) || (a > c)) { doSomething(); } statementX; statementY; } 我需要将其转换为条件表达式,这就是我所做的: (a) ? (((a > b) || (a > c)) ? doSomething() : something_else) : something_else; 在哪里插入语句statementX

我有一个程序流程如下:

if(a)
{
    if((a > b) || (a > c))
    {
        doSomething();
    }
    statementX;
    statementY;
}
我需要将其转换为条件表达式,这就是我所做的:

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

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

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


将某个内容设置为一行可能看起来不错,但就失去可读性而言,这是不值得的(性能没有提高)。

您可以使用逗号
运算符,如下所示:

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

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

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

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

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

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

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

为什么?我觉得它的第一种形式更具可读性!。。你的
if
s没有
else
s,因此使用三元运算符不是解决问题的好办法。尽管我对三元运算符的简洁性很在行,但我很少使用它-正如Joe提到的,它限制了可读性。此外,你不能将语句视为表达式,所以你甚至会得到一个编译器错误。谁给了你这样一个“赋值”?简单但精确。谢谢
return c1 ? v1 :
       c2 ? v2 :
       c3 ? v3 :
       c4 ? v4 :
       vdefault;