【问题标题】:Condition with logical operator in the for loopfor循环中带有逻辑运算符的条件
【发布时间】:2015-02-12 05:35:18
【问题描述】:

我用 Eratosthene 的 Sieve 用 C 语言编写了寻找素数的程序(这是 Kochan 中的练习 6-8,Programming in C 4th edition)。它工作得很好。

#include <stdio.h>

int main(void) {
    int prime[151], i, j;

    for(i = 2; i < 151; ++i)
        prime[i] = i;
    for(i = 2; i <= 150; ++i) 
        if(prime[i])
            for(j = i+i; j <= 150; j += i)
                prime[j] = 0;
    for(i = 2; i < 150; ++i)
        if(prime[i])
            printf("%i ", prime[i]);
    printf("\n");
    return 0;
}

但在我达到那种形式的代码之前,我会尝试那个 for 循环:

for(i = 2; prime[i] && i < 150; ++i)

该表单通过删除 if 语句保存位置,我认为需要以与第一个变体相同的方式工作。但它在数字 3 之后停止! 谁能解释一下为什么 for 循环中的条件会这样工作?

附:是的,我知道这个程序的算法不是最好的。

【问题讨论】:

  • 旁注:您也可以将prime[i] = i 更改为prime[i] = 1 并将printf("%i ", prime[i]) 更改为printf("%i ", i)

标签: c for-loop conditional-statements


【解决方案1】:

for 循环的中间部分类似于while,而不是if。所以一旦你找到并索引prime[i]0 的位置,循环就会终止。

【讨论】:

    【解决方案2】:

    不,它们不一样:

    • 原始循环跳过所有非质数并继续运行。
    • 提议的替换在遇到第一个非质数时立即终止(因为prime[i] 将变为false,循环将停止)。

    【讨论】:

    • 现在我明白了。需要多加注意。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多