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)