【问题标题】: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;}

标签: c syntax logic structure conditional-statements


【解决方案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;是单个表达式)

      【讨论】:

        猜你喜欢
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2015-04-05
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多