【问题标题】:Equivalent using for-loop instead do-while-loop等效于使用 for-loop 而不是 do-while-loop
【发布时间】:2014-01-11 04:32:14
【问题描述】:

我想知道,除了使用 do-while 循环之外,什么是等效的 for 循环或 c 中的任何其他循环组合?

【问题讨论】:

  • 你怎么看? do-while(与直接while 相比)的主要问题是循环总是至少迭代一次。

标签: c for-loop do-while


【解决方案1】:

没有其他循环至少执行一次循环内容,就像 do-while 那样。当然你可以用一个标志和一个while循环来模拟do-while:

do {
    A;
} while (B)

变成

int flag=1;
while (flag || B) {
    flag=0;
    A;
}

但这并不是真正的替代方案,它只会掩盖你的初衷。

【讨论】:

    【解决方案2】:

    任何类型的循环都可以由无限“永远”循环和条件break 语句的组合构成。

    例如转换

    do {
        <action>
    } while (<condition>);
    

    for 循环,你可以这样做:

    for (;;) {
        <action>
        if (!<condition>) break;
    }
    

    您可以使用相同的技巧将do/while 循环转换为while 循环,如下所示:

    while (true) {
        <action>
        if (!<condition>) break;
    }
    

    此外,根本不需要循环:上面的任何一个都可以用顶部的标签和底部的goto 建模;这是在汇编语言中进行循环的常用方法。最初将三个循环结构引入语言的唯一原因是为了让语言更具表现力:do/while 循环比上面显示的任何替代方案都更好地实现了作者的想法。

    【讨论】:

    • 所以 if (!) break;会和 do 部分一样吗?
    • @deathshot 是的,“中断”条件是否定的“继续”条件。
    【解决方案3】:

    以下三个循环都是等价的:

    #define FALSE (0)
    #define TRUE  (!(FALSE))
    
    do
    {
        status = getStatus();
    }
    while(status == TRUE);
    
    status = TRUE;
    while(status == TRUE)
    {
        status = getStatus();
    }
    
    for(status = TRUE; status == TRUE; status = getStatus())
    {
    }
    

    【讨论】:

    • @OliCharlesworth 谢谢。
    • 哦,我真的是在暗示这会习惯性地写成status,而不是status == true
    • 只是为了新程序员而试图明确。使用while(status) 肯定看起来更好。
    • 不应该是status = TRUE;(而不是true)之前的分配吗?
    • @Rich 已修复。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多