【问题标题】:While loop, extra loop even though condition is falseWhile 循环,即使条件为假,也有额外的循环
【发布时间】:2014-03-30 03:18:38
【问题描述】:

我正在使用 javascript,但我正在寻找可能适用于多种语言的通用解决方案。

我想要一个运行时间比预期长一倍的 while 循环。

例如(假设变量在上面定义):

while (x != ">") {
    i++;
    tempStr += x;
    x = text[i];
}

所以上面代码的输出将有tempStr的最后一个字符是">"

要记住的重要一点是,我不只是想做这样的事情:

while (x != ">") {
    i++;
    tempStr += x;
    x = text[i];
}
tempStr += x;

上面只是一个例子,在它的条件为假之后,在最后一个循环中运行 while 循环可能会很方便。尽管我无法与您分享我的实际代码(出于法律原因),但只要知道上述内容并不是我心目中的应用程序的解决方案。

可能无法做我想做的事情,如果是,请告诉我:)

【问题讨论】:

  • 我会说你的条件应该被调整,这样当它为假时,它不需要再次运行。
  • do loop 可以工作吗?
  • 您可以使用“if”,然后使用“do loop”
  • 也许是一个 do 循环 包裹在带有初始条件的 if 语句中?
  • @esdebon - 嘿,你打败了我!

标签: javascript loops while-loop conditional-statements cycle


【解决方案1】:
    while(condition || !extraLoopCondition) {
        //The usual stuff
        if(!condition) {
            extraLoopCondition = true;
        }
    }

虽然不是很有说服力,但它一定会做你想做的事

大概最后一个循环的结尾处condition 为假

【讨论】:

  • 不应该是||吗?
  • 使用带有|| 和内部if 语句的while 循环,或者在外部使用if 语句并在if 语句中使用do while 会更高效吗?
  • 我以为你在 OP 中说过你不能让代码在 while 循环之外运行。如果不是这样,您在此处发布的第二件事有什么问题?
【解决方案2】:

是的,do...while() 结构在大多数语言中都有。

http://www.php.net/manual/en/control-structures.do.while.php

<?php
$i = 0;
do {
    echo $i;
} while ($i > 0);
?>

【讨论】:

  • do...while 在开始而不是结束时额外执行循环代码
  • 从用户对他自己问题的回答中可以看出,这无关紧要。
【解决方案3】:

根据 Mike 的评论,使用 do 循环:

var tempStr = '';
var x, i=0;

do {
    x = text[i++];
    tempStr += x;
} while (x != '>')

请注意,您可能应该有一个替代限制以防止无限循环,以防万一 x 永远不是“>”,例如

...
while (x != '>' && text[i])

或类似的。还测试通过索引访问字符串字符在所有浏览器中都有效,有些不允许它(旧 IE)所以可能更好使用:

    x = text.substr(i++, 1);

    x = text.charAt(i++);

【讨论】:

  • do 循环不会起作用,因为即使条件为假,它也会执行一次。我试图仅在满足条件时开始循环,然后在最后运行一次。
  • 那么你应该在问题中指定。您需要两项测试——一项启动循环,一项停止循环。没有 if..while 循环,但您可以将 while 嵌套在 if 中。
【解决方案4】:

你说你不想在一段时间后编写代码......就像在

while (x != ">") {
    i++;
    tempStr += x;
    x = text[i];
}
tempStr += x;

但你也说do{}while 不起作用,因为条件必须是 validate.. 但是.. 如果必须验证条件意味着您在循环之外有代码.. 但在此之前.. 您的示例仅在代码是这样的情况下才有效

x = text[i=0];
while (x != ">") {
    i++;
    tempStr += x;
    x = text[i];
}

所以我真的没有看到在循环之外有代码的问题。除非你做一些非正统的代码,否则你无法避免它

for(x = text[i=0];(tempStr = tempStr +x).substring(tempStr.length-1) != ">";x = text[i])  
    i++

但这是最糟糕(最丑陋)的解决方案.. 不管是什么问题.. 无论如何..当我进行解析或字符串操作时,我需要附加最后一个字符 通常我的代码是这样的

for(var i=0;text.length>0;i++)
{
    var x = text[i]; //get the char
    tempStr += x;//do somthing..like..append
    if(x==">")//is the last one admissible
        break;
}

【讨论】:

    【解决方案5】:

    其实,我只是想到了一些事情。虽然还没有测试过。 (esdebon也建议过这个,我只是在发布之前没有看到它)

    if (x != ">") {
        do {
            i++;
            tempStr += x;
            x = text[i];
        }
        while (x != ">")
    }
    

    【讨论】:

    • 如果您现在选择自己的答案,那就太蹩脚了。这里的 10 个人完全知道该怎么做。在它回答了问题中不清楚的部分问题之前,您从未选择过它。
    【解决方案6】:

    这符合您的要求吗?

    if( x != ">" ) tempStr += x;
    while (x != ">") {
        x = text[++i];
        tempStr += x;   
    }
    

    如果x 不等于'&gt;',这会将tempStr 的最后一个字符保留为&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多