如何使用条件运算符表达三种情况
How to express three cases with the conditional operator?
是否可以使用条件运算符来表达情况?例如:
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 语句更好
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- C++:我的开关盒循环转到第一种情况
- 多维数组存储三种不同的数据类型?
- 如何使一个函数具有三种不同的输出条件?
- 两种情况下的输出不应该相同吗?
- 输出一个数字,该数字可能是三种类型之一
- 为什么'const'在这两种情况下的行为不同?
- 如何创建一个包含三种不同类型的向量的向量
- 在哪种情况下,C++会在编译时进行数组边界检查?
- free():仅在一种情况下指针无效
- 当一种方法有三种返回可能性时该怎么办?
- 程序在开关中执行第二种情况后崩溃
- 在两种情况下,铸造的工作方式不同
- 如果ConstexPR似乎仅在两种情况有效时起作用
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 三种类型之间的隐式转换交互
- 如何以及何时使用(或不使用)三种特定情况的例外
- 在给定前景色和背景色的情况下,我如何计算第三种颜色
- 如何使用条件运算符表达三种情况