【问题标题】:An empty if statement一个空的 if 语句
【发布时间】:2016-08-11 17:05:22
【问题描述】:

我已经设置好了:

for i=1:10
    if (condition1)

    elseif (condition2)
        (do something)
    else
        (do something)
    end
end

对于condition1,如果满足条件,我不希望发生任何事情,我只想使用下一个值i 再次运行循环。我该怎么做?我可以在if 语句下方将其留空,还是有更优雅的方法来做到这一点?如果我删除第一个if 语句,如果没有满足其他条件,循环期间会发生什么?

如果可能的话,我想避免运行第一个if 语句,因为我的问题具有最高的复杂性。检查condition1 是很重要的,因为如果满足,那么我想移动到i 的下一个值。我希望这个问题有意义。

【问题讨论】:

  • 我认为留下一个空的 if 是完全可以的。我会在里面添加一个注释,解释在这种情况下什么都不需要做,所以当你一段时间后回到代码时,你不会想知道为什么会有一个空的 if。
  • Stewie Griffin 的回答解释了为什么删除第一个条件是不好的(这会导致不良行为)。我是说把它留空(或者更好的评论)很好
  • 就我个人而言,我喜欢将一行留空的方法,只有一条评论说什么都不做。这仅适用于循环中有更多代码,位于 if 语句下方并且此代码应始终运行的情况。如果我想强调我想进入下一个迭代,我会继续。如果代码很复杂,那么跳过东西不是最好的方法。最好把代码分成函数。这将使每个功能更短且更易于概览。良好的命名将使用户无需深入每个子功能即可阅读代码。

标签: matlab loops if-statement


【解决方案1】:

您想使用continue 语句,这会跳过循环的当前迭代:

for i=1:10

    if (condition)
        continue;

    elseif (condition)
        (do something)

    else 
        (do something)

    end
end

见:http://www.tutorialspoint.com/matlab/matlab_continue_statement.htm

【讨论】:

  • 添加continue仅在循环中在if-construct 的end 语句之后执行了其他操作时才相关,您不想执行这些操作。
  • 可能值得注意的是, continue 将跳过最内层循环内的其余代码,直接进入本次迭代的末尾。
【解决方案2】:

ialquaz 的答案是正确的(在我看来),因此无需详细说明。相反,我会回答你第二个问题:

如果我删除第一个 if 语句,循环期间会发生什么 如果其他条件都不满足?

这取决于您的条件,但总的来说,是的!

这是因为最后一个else 捕获了所有其他条件都不满足的情况。例如,假设您有以下循环:

n = 9;
x = zeros(1,n);
for ii = 1:n
    if ii < 3
        continue;
    elseif ii > 5
        x(ii) = 4;
    else 
        x(ii) = 6;
    end
end
x =    
   0   0   6   6   6   4   4   4   4

如您所见,在开始时,continue 语句使循环跳过最后一个elseifelse。这意味着前两个元素不会被触及。 elseif ii &gt; 5 将导致 ii == 6 设置为 4 之后的所有元素更高。当ii &gt;= 3 &amp; ii &lt;= 5 else 将捕获剩余的情况时,这些元素将是6。现在,让我们看看如果我们跳过第一个 if 会发生什么:

n = 9;
x = zeros(1,n);
for ii = 1:n
    if ii > 5
        x(ii) = 4;
    else 
        x(ii) = 6;
    end
end
x =
   6   6   6   6   6   4   4   4   4

前三个元素不再被第一个 if 语句覆盖,因此被 else 捕获。

【讨论】:

    【解决方案3】:

    如果你想跳过condition2 如果condition1 为真,只需要求相反:

    for i = 1:10
        if ~(condition1)
            if (condition2)
                (do something)
            else 
                (do something)
            end
        end
    end
    

    ~(“不是”)将把true 变成false,反之亦然。由于您只想在condition1false 时才执行condition2 的两个语句块(在else 之前和之后),因此您必须在每次迭代中明确检查它。

    【讨论】:

    • 我试过这个并重新运行程序,我的输出由于某种原因完全改变了。问题是,如果满足第一个 if 语句我不想继续当前循环,我想移动到 i 的下一个值。但是当我删除它并且不满足条件 2 时,它会在“else”下进行计算,这是我不想要的。
    • @EBH 使用if ~cond1&amp;&amp;cond2elseif ~cond1end怎么样?
    • @Crowley 显然,有不止一种方法可以做到这一点,OP 必须决定什么对他来说最易读。但是,如果 cond2 很复杂,您的建议可能效率会降低。
    • @EBH 或者如果cond1 很复杂。但是如果它很复杂,你应该把它放在一个单独的变量中,并给它一个有意义的全名。这提高了可读性。
    • @Bernhard 我不是 OP,所以我不知道这个条件有什么意义。当我说执行时间很复杂时,如果检查condition2 需要很多时间,那么将它放在condition1 中可以消除不必要的检查。
    【解决方案4】:
    for i=1:10
        if (condition) && ~(condition1)
            (do something)
        elseif ~(condition1)
            (do something)
        end
    end
    

    以上方法也可以

    【讨论】:

    • 这不起作用,因为else 之后的语句将在~(condition) = false 时执行。
    • @EBH,感谢您指出这一点。我编辑了它,希望现在可以了。
    • elif应该是elseif,而且这里也没有优化,每次迭代都会检查condition1condition2
    【解决方案5】:

    如果条件 1 恰好为真,并且如果“真”你不想做任何事情,你就不需要在代码中这样做。所以我会用这样的东西:

    for i=1:10
        //commenting 'if' for condition1 since you wouldn't need it
        //if (condition1)
    
        if (condition2)
            (do something)
        else
            (do something)
        end
    end
    

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多