[英]How to simplify compound negated logic
可以說我有布爾值B []的數組,或者我正在使用函數確定對/錯。 我如何簡化此代碼,因為它有很多值(可能是幾十個)? 這是偽代碼:
if(!B[0]){
doTask1;
}
if(!B[0] && !B[1]){
doTask1;
doTask2;
}
if(!B[0] && !B[1] && !B[2]){
doTask1;
doTask2;
doTask3;
}
...
編輯1:我忘了提一提,我希望doTask1等僅發生一次(如果其中任何一個為true),而不是多次執行(例如,如果1.st if是true,第二個也是true,我仍然只需要發生一次)
您可以使用函數指針數組。
typedef void *(* funcPtr)(void);
funcPtr arrayFunPtr[N];
然后將函數存儲到數組中。
arrayFunPtr[0]= task1;
arrayFunPtr[1]= task2;
....
arrayFunPtr[N-1]= taskN;
然后循環bool
數組並調用相應的索引函數。
for(int i=0;i<N;i++)
{
if(!B[i]) arrayFunPtr[i]();
}
@編輯。
如果您想在單擊B[i]=true
停止調用tasks
功能,請使用以下代碼。
for(int i=0;i<N && !B[i] ;i++)
{
arrayFunPtr[i]();
}
函數指針是這里的方法。 如果您不喜歡函數指針,則可以使用如下所示的switch
構造:
switch(i) {
case 3:
if(!B[0] && !B[1] && !B[2]) doTask3();
case 2:
if(!B[0] && !B[1]) doTask2();
case 1:
if(!B[0]) doTask1();
}
或者您可以:
您可以編寫一個方法:
simplify(int[] B, int l) {
for (int i =0 ; i < l, i++) {
// write the code using &&
}
}
然后可以將該方法調用為:
if(simplify(B, 1){
doTask1;
}
if(simplify(B, 2){
doTask1;
doTask2;
}
等等
(假設您不想多次執行相同的任務,即使原始代碼可以完成)
制作一個函數doTask()
,它將使用要執行的任務的數量(或僅制作一個函數指針數組)。 接着:
for(i=0; i < numberOfTasks; i++)
{
if (!B[i])
doTask(i);
else
break;
}
或更簡而言之:
for(i=0; i < numberOfTasks && !B[i]; i++)
{
doTask(i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.