Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++_C_Conditional Operator - Fatal编程技术网

C++ 如何用条件运算符表示三种情况?

C++ 如何用条件运算符表示三种情况?,c++,c,conditional-operator,C++,C,Conditional Operator,是否可以使用条件运算符表示事例?例如: if(rval==1) DO THIS 1; else if(rval==2) DO THIS 2; else if (rval ==3) DO THIS 3; 虽然这不是三元运算符的常用用法,但您可以这样做: ( rval == 1 ) ? (expression1) : ( rval == 2 ) ? (expression2) : ( rval == 3 ) ? (expression3) : (defaul

是否可以使用条件运算符表示事例?例如:

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

虽然这不是三元运算符的常用用法,但您可以这样做:

( rval == 1 ) ? (expression1) : 
( rval == 2 ) ? (expression2) : 
( rval == 3 ) ? (expression3) : (default);
但是,为了代码的可读性,我建议您坚持使用
if
语句

或者更好的是,在这里使用
开关更合适

编辑:

这是我用于测试的代码:

void foo() {};
void goo() {}

int main()
{
   int x = 0;
   x == 0  ? foo() : x == 1 ? goo() : foo();
}
编辑2:


对于所有反对者,请参见第5.16节,第二个和第三个操作数是表达式;第
5.16.2节
涉及类型为void的表达式。

您不能。您所拥有的看起来像是一个
开关的用例
-语句:

switch(rval) {
    case -1: DO THIS 1; break;
    case  2: DO THIS 2; break;
    case  3: DO THIS 3; break;
    default: ERROR;
}
编辑我在这里太渴望了。正如评论中指出的,您可以这样做(正如他在中所演示的)。请注意,对于§5.16/2[expr.cond]中规定的一个或两个表达式为
void
类型的情况,这一点也有很好的定义:

如果第二个或第三个操作数具有类型(可能是 cv-qualified)void,然后将左值转换为右值(4.1),数组转换为指针 (4.2)和函数到指针(4.3)的标准转换是 对第二个和第三个操作数以及以下操作之一执行 应举行:

-第二个或第三个操作数(但不是两个)是 投掷表情(15.1);结果是另一个的类型,是 右旋值

-第二个和第三个操作数都具有void类型; 结果为void类型,为右值

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


但我认为使用if station或switch station更好

,这看起来很难看,而且违反了我见过的所有编码标准。然而,它看起来是这样的:

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

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

在许多情况下确实需要使用表达式(例如,在需要表达式的宏中展开)

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

令人遗憾的是,语句和表达式之间存在这种区别(这非常不自然,在所有现代命令式结构语言的祖父Algol中都没有出现),但有非标准的扩展来利用这种不公正性:

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

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



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

三元运算符用于条件表达式,不适用于控制流为什么不使用switch case?不要这样做。充其量,这将是不可读且容易出错的。理想情况下,您不希望使用三元运算符实现逻辑,但它可以实现。您能提供一个指向标准的链接,说明您不能吗?@LuchianGrigore:我不能-您让我做到了。但我不知道如何使用条件运算符运行任意内容(正如OP在问题中所建议的)。如果您的解决方案中的
表达式
是一个
void
-函数,会发生什么?我确实用一个void函数测试了它。。。而且它是有效的。。。它不必归还任何东西。它可以完全用作if语句,除非您不能有代码块,只能有表达式。试试看。@LuchianGrigore:你能提供一个标准的引文来证明这不是未定义的行为吗?@Luchian:也许可以试试其他的PDF阅读器?请注意,PDF阅读器中的默认设置有时是单击链接,但不选择文本,您可能必须选择“文本突出显示工具”或@all:请注意,这里还有另一个限制,表达式需要转换为通用类型。因此,在某些情况下,您可能会发现自己正在编写
(rval==1)?(void)dothis1():(rval==2)?(void)dothis2():(void)dothis3(),您可能会想知道为什么不使用switch语句。您能提供一个指向标准的链接吗?我的意思是“dothis”必须是一个表达式(返回一个值)。它不可能只是任何代码块。这不对吗?你应该在答案中指明这一点,因为你确实可以对表达式这样做。“这不对吗?”--不,这不对。。。表达式可以是空的;它不需要返回值。如果该函数返回void怎么办?@Paul:…那么它就不起作用了。但我正试图尽可能接近他的请求范围。不是“不要这样做”。只是把它格式化好,以便清楚地知道你在做什么。就像Lucien Grigor所做的那样,或者用所有的
在新行的开头,适当地缩进。(没有不必要的括号:
c1?x1:c2?x2…
等同于
if…else if…
)@Paul,Brent OP没有要求返回值…如果函数返回void且未使用该值,则可以正常工作。请参见Luchian Grigore相当出色的回答。事实上,我认为您的第一个示例应该是一个或多或少的标准习惯用法。前提是它的格式能够清楚地显示正在发生的事情。例如,正如您所做的那样e、 我会在适当的时候使用它,并且我想其他人会足够熟悉它来识别它;像这样的
return
比一堆
if
s,每个分支中都有一个return,可读性要好得多。太棒了!这不是有效的C(虽然它没有包含分号的Jiri Pik版本那么糟糕。)不需要
0
void
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)