如何使用条件运算符表达三种情况

How to express three cases with the conditional operator?

本文关键字:三种 情况 何使用 条件运算符      更新时间:2023-10-16

是否可以使用条件运算符来表达情况?例如:

 if(rval==1)
     DO THIS 1;
 else if(rval==2)
     DO THIS 2;
 else if (rval ==3)
     DO THIS 3;

你不能。您那里的内容看起来像是switch语句的用例:

switch(rval) {
    case -1: DO THIS 1; break;
    case  2: DO THIS 2; break;
    case  3: DO THIS 3; break;
    default: ERROR;
}

编辑 我在这里过于急切了。正如@Luchian格里高雷在评论中指出的那样,你可以这样做(正如他在回答中展示的那样(。请注意,对于一个或两个表达式属于 void 类型的情况,这也得到了很好的定义,如 §5.16/2 [expr.cond] 中所述:

如果第二个或第三个操作数具有类型(可能 CV 合格(无效,然后是左值到右值 (4.1(,数组到指针 (4.2( 和函数到指针 (4.3( 标准转换为 在第二个和第三个操作数上执行,以及以下操作数之一 应持有:

— 第二个或第三个操作数(但不是两个(是 投掷表达式(15.1(;结果是另一个的类型,并且是 一个右值。

— 第二个和第三个操作数都有类型空; 结果的类型为 void,并且是右值。

[注:这包括 两个操作数都是抛出表达式的情况。]

虽然这不是三元运算符的常用用法,但这是你这样做的方式:

( rval == 1 ) ? (expression1) : 
( rval == 2 ) ? (expression2) : 
( rval == 3 ) ? (expression3) : (default);

但是,为了代码的可读性,我建议您坚持使用if语句。

或者更好的是,似乎switch在这里更合适。

编辑:

这是我用于测试的代码:

void foo() {};
void goo() {}
int main()
{
   int x = 0;
   x == 0  ? foo() : x == 1 ? goo() : foo();
}

编辑2:

对于所有反对者 - 请参阅第 5.16 节 - 第二个和第三个操作数是表达式;第 5.16.2 节处理类型为 void 的表达式。

这看起来很丑陋,并且违背了我见过的所有编码标准。 尽管如此,它看起来像这样:

int rval;
int foo = rval == -1 ? DoThis1() : (rval == 2 ? DoThis2() : DoThis3());

我假设 rval == 3 是唯一可能的其他选择。 如果这个假设是错误的,它会使整个混乱更像是"不要这样做"的声明

!!
switch ( rval ) {
  case 1 : 
    // Process for rval = 1
    ...
    break;
  case 2 : 
    // Process for rval = 2
    ...
    break;
  case 3 :
    // Process for rval = 3
    ... 
  default : 
    throw new InvalidStateException()
    // Process for all other cases.
    ...
}

像这样:

    void MySwitch(int rval)
    {
             (rval==-1) ? DoThis(-1),0 :
            ((rval==2) ? DoThis(2),0 :
            ((rval==3) ? DoThis(3),0 : 0));
    }

完整示例:

    #include <stdio.h>
    void DoThis(int j)
    {
     printf("DoThis(%d)n", j);
    }
    void MySwitch(int rval)
    {
             (rval==-1) ? DoThis(-1),0 :
            ((rval==2) ? DoThis(2),0 :
            ((rval==3) ? DoThis(3),0 : 0));
    }
    int main(void)
    {
     printf("Calling MySwitch(-1)n");
     MySwitch(-1);
     printf("Calling MySwitch(2)n");
     MySwitch(2);
     printf("Calling MySwitch(3)n");
     MySwitch(3);
     printf("Calling MySwitch(4)n");
     MySwitch(4);
    }

输出:

Calling MySwitch(-1)
DoThis(-1)
Calling MySwitch(2)
DoThis(2)
Calling MySwitch(3)
DoThis(3)
Calling MySwitch(4)

当然,这是愚蠢的。永远不要这样做。

确实有很多情况下需要使用表达式(例如,在需要表达式的扩展宏中(。

它们都是有效的,如果使用得当,将提高可读性。

遗憾的是,语句和表达式之间存在这种区别(这是非常不自然的,并且在所有现代命令式结构语言的祖父 Algol 中不存在(,但是有一些非标准的扩展来利用这种不公正:http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs

因此,使用此扩展程序对您的问题的答案如下:

rval==1?({DO-THIS}):(?rval==2:({...}):...)

但请确保 DO-THIS 的最后一个语句始终是产生值的表达式。

int lval = (rval==-1) ? 1 : ( (rval==2) ? 2 : 3 );
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int rval = 2;
    (rval==-1)? (printf("-1")) :( ((rval==2) ?(printf("2")) : ((rval ==3) ? (printf("3")) : (1)) ));
    return 0;
}
if(rval == 1 ? DoThis1() : (rval == 2 ? DoThis2() : (rval == 3 ? DoThis3() : /*do nothing*/)))
{
    // The if-body.
}

但我认为使用 if 语句或 switch 语句更好