3

我有一些看起来像的逻辑

if(a){
 if(b){
  if(c){
    //do something
  }else{
    //do something
  }    
 }else{
  if(c){
    //do something
  }else{
    //do something
  }    
 }else{
 if(b){
  if(c){
    //do something
  }else{
    //do something
  }    
 }else{
  if(c){
    //do something
  }else{
    //do something
  }    
}

将其实现为可读逻辑的最佳方法是什么?我不想做一些大的 OOP 手术来使它可读,因为做某事只是一个衬里。赞赏 C/C++ 中的解决方案

4

2 回答 2

5

由于条件是布尔值,并且显然是独立的,因此将它们视为单词中的位switch

#include <cstdio>

#define COMPOSE(a,b,c) ( ((!!(a)) << 2) | ((!!(b))<<1) | (!!(c)) )

int f(int i, int j, int k) {

  switch(COMPOSE( i==j, i+j<k, k!=42)) {
  case COMPOSE(true, true, true):
    printf("yo\n");
    break;
  case COMPOSE(true, true, false):
    printf("ye\n");
    break;
  case COMPOSE(true, false, true):
    printf("ya\n");
    break;
  }
}

int main () {
  f(1,1,1);
}
于 2012-05-01T19:53:15.900 回答
5

如果一切//do something都根本不同,那么您没有太多选择(afaik)。

对于代码风格,我更喜欢

if ( a && b && c ) 
{
}
else if ( a && b && !c )
{
}
else if ( a && !b && c )
...

这消除了多级缩进的必要性,并明确了实际满足哪个条件。

旁注:显然a && b && !c可以表示为a && b因为!(a && b && c)和使用else if。无论如何我都会把它留在那里,因为编译器可能会优化它并且代码看起来更干净。

于 2012-05-01T19:54:45.750 回答