什么是编码嵌套二进制分支逻辑的可读方式

leo*_*on 3 c c++ boolean-logic

我有一些看起来像的逻辑

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
  }    
}
Run Code Online (Sandbox Code Playgroud)

将此实现为可读逻辑的最佳方法是什么?我不想做一些大的OOP手术让它可读,因为做的事情只是一个衬垫.感谢C/C++中的解决方案

Rob*_*obᵩ 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);
}
Run Code Online (Sandbox Code Playgroud)


ste*_*fan 5

如果一切//do something根本不同,你没有太多选择(afaik).

对于代码风格我更喜欢

if ( a && b && c ) 
{
}
else if ( a && b && !c )
{
}
else if ( a && !b && c )
...
Run Code Online (Sandbox Code Playgroud)

这消除了多级缩进的必要性,并清楚地表明实际满足了哪种条件.

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