有没有办法将几个不同的条件与共享语句结合起来?
Posted
技术标签:
【中文标题】有没有办法将几个不同的条件与共享语句结合起来?【英文标题】:Is there a way to combine several different conditionals with a shared statement? 【发布时间】:2015-07-11 18:55:02 【问题描述】:例如:
int a;
...
if (a == 1)
foo;
...
return K1;
else if (a == 2)
foo;
...
return K2;
...
else if (a == i)
foo;
...
return Ki;
有没有一种聪明的方法可以将foo
排除在外,但只能在这些条件下实现? (就像代数中的因式分解:2x+6=2(x+3))。
感觉重复,所以我认为应该有办法缩短它。
【问题讨论】:
可以foo; return array[i];
吗?
@WeatherVane 这实际上是个好主意,但返回的值并不总是存储在数组中。
如果有一种简单的方法可以将条件组合成一个条件(例如,1 <= a && a <= i
),您可以在大 else-if 链之前有一个 if (combined_condition) foo;
。
【参考方案1】:
在你的场景中这样的事情可以吗?
int a;
int k; // let's assume int
...
k = a == 1? K1:
a == 2? K2:
...
a == i? Ki:
K0; // a special value
if (k != K0)
foo;
return k;
【讨论】:
比我的更聪明的解决方案:D 这真的取决于原始帖子中“...”块的重量。 @user3125367 是的,这也取决于我们是否有连续序列 1,2,...,i
或其他任何东西。
@user3125367 因为如果我们假设我们有序列,那么可以使用数组,正如其他人所建议的那样。
哦,那取决于 K* 的纯度和亮度 :)【参考方案2】:
假设返回值是int
类型(相应地改变它)。您可以使用以下内容:
int a;
int retVal;
int execFoo;
execFoo = 0;
...
if (a == 1)
execFoo = 1;
...
retVal = K1;
else if (a == 2)
execFoo = 1;
...
retVal = K2;
...
else if (a == i)
execFoo = 1;
...
retVal = Ki;
if(execFoo == 1)
foo;
return retVal;
【讨论】:
IMO,这感觉和原始代码一样重复。 @Unda 可以在 ifs 之前使用 execfoo = 1 进行修复,并在 else-block 中将其重置一次。不过,这并不能解决 foo 在 其他块之后被调用的问题。【参考方案3】:我觉得最好用辅助函数获取a
对应的k
,然后用k
的值调用foo
。
// Function to get K given a.
int getK(int a)
switch (a)
case 1:
return K1;
case 2:
return K2;
default:
return K_Unknown;
函数的使用:
int a;
int k = getK(a);
if ( k != K_Unknown )
foo;
【讨论】:
【参考方案4】:扩展 WeatherVane 对数组的评论 - 值 可以 始终存储在数组中,即使它们没有以这种方式到达有问题的块 - 只需将它们放入新的块中:
T array[] = [1] = K1, K2, K3, ..., Ki ;
foo();
return a <= i && a > 0 ? array[a] : K0;
【讨论】:
【参考方案5】:你可以#define一个宏IF(cond) if ((cond) && (<foo>, 1))
并在所有块之后#undef它:
#define IF...
IF (a == 1) ...
else IF (a == 2) ...
#undef IF
(前提是<foo>
是单个表达式)
【讨论】:
以上是关于有没有办法将几个不同的条件与共享语句结合起来?的主要内容,如果未能解决你的问题,请参考以下文章
如何将多个 INSERT INTO 与准备好的语句结合起来?
将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件
在 Azure 流分析中结合 UNION 和 WITH 语句