【问题标题】:How to simplify compound negated logic如何简化复合否定逻辑
【发布时间】:2019-02-15 17:18:01
【问题描述】:

假设我有一个布尔值数组 B[],或者我正在使用函数来计算真/假。我怎样才能简化这段代码,它有很多值(可能有几十个)?这是伪代码:

if(!B[0]){
    doTask1;
}
if(!B[0] && !B[1]){
    doTask1;
    doTask2;
}
if(!B[0] && !B[1] && !B[2]){
    doTask1;
    doTask2;
    doTask3;
}
...

编辑 1:我忘了提,我希望 doTask1 等只发生一次(如果其中任何一个 ifs 为真),而不是多次执行(如果例如 1.st if 为真,第二个为真同样,我仍然只需要发生一次)

【问题讨论】:

  • 所以,if B[0] == B[1] == B[2] == 0 你正在做task1 三遍。你想要这个吗?
  • 也许您应该尝试使用代码解释您想要的行为。
  • @RishikeshRaje 你是对的,我希望它只发生一次。我会更新的。

标签: c if-statement logic


【解决方案1】:

您可以使用函数指针数组。

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.

如果您想在点击B[i]=true 后停止调用tasks 函数,请使用以下代码。

  for(int i=0;i<N && !B[i] ;i++)
  {
      arrayFunPtr[i]();
  }

【讨论】:

  • 这不是等价的。如果我理解要求,则在第一个 B[i] 为 true 后,您不应执行任何操作。
  • @EugeneSh。我不知道,因为没有提到任何那种 OP。无论如何,我会更新答案。
  • 他发布的代码正是显示了这一点。如果B[0] 为真,则不会执行任何任务。
  • 更新后满足所有要求,可以正常使用,谢谢。
【解决方案2】:

(假设您想要多次执行相同的任务,即使您的原始代码会这样做)

创建一个函数doTask(),它将获取要执行的任务的数量(或者只是创建一个函数指针数组)。然后:

for(i=0; i < numberOfTasks; i++)
{
     if (!B[i])
         doTask(i);
     else
         break;
}

或者更简洁:

for(i=0; i < numberOfTasks && !B[i]; i++)
{
     doTask(i);
}

【讨论】:

  • 这就是我需要的!
【解决方案3】:

函数指针是这里的方法。 如果你不喜欢函数指针,你可以使用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;
}

等等

【讨论】:

  • 看起来有点长,如果我必须写多个ifs,但符合要求并且有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2011-01-29
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多