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++中的解决方案
由于条件是布尔值,并且显然是独立的,因此将它们视为单词中的位和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)
如果一切//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.无论如何我会把它留在那里因为编译器可能会优化它并且代码看起来更干净.
归档时间: |
|
查看次数: |
163 次 |
最近记录: |