有没有办法将几个不同的条件与共享语句结合起来?

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) &amp;&amp; (&lt;foo&gt;, 1))并在所有块之后#undef它:

#define IF...
IF (a == 1)  ... 
else IF (a == 2)  ... 
#undef IF

(前提是&lt;foo&gt;是单个表达式)

【讨论】:

以上是关于有没有办法将几个不同的条件与共享语句结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 INSERT INTO 与准备好的语句结合起来?

可以将多个字段与一个条件 if 语句连接起来

将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件

在 Azure 流分析中结合 UNION 和 WITH 语句

将 lapply 与 for 和 if..else 语句结合使用,将条件列添加到多个数据帧

第五次作业总结