让我们说我有布尔值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)同样,我仍然只需要发生一次)
答案 0 :(得分:2)
您可以使用函数指针数组。
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]();
}
@Edit。
如果您想在点击tasks
之后停止调用B[i]=true
函数,请使用以下代码。
for(int i=0;i<N && !B[i] ;i++)
{
arrayFunPtr[i]();
}
答案 1 :(得分:1)
函数指针是解决问题的方法。
如果您不喜欢函数指针,则可以使用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;
}
等
答案 2 :(得分:1)
(假设您不希望多次执行同一任务,即使您的原始代码会这样做)
制作一个函数doTask()
,该函数将采用要执行的任务的编号(或仅创建一个函数指针数组)。然后:
for(i=0; i < numberOfTasks; i++)
{
if (!B[i])
doTask(i);
else
break;
}
或更简洁地说:
for(i=0; i < numberOfTasks && !B[i]; i++)
{
doTask(i);
}