java - 在Java中使用 "for"循环时 boolean 变量的初始化

标签 java

我有一个有趣的问题。我正在编写一个程序来打印 1 到 100 之间的质数。首先让我向您展示我的代码:

public class Lessons {
    public static void main(String[] args) {
        int b;
        boolean isPrime = true;

        for (int a=2; a<=100; a++) {
            for (b=2; b<a;b++) {
                if (a%b==0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                 System.out.println(a);
            }
        }
    }
}

该程序的输出是2 3,这是错误的。但是,如果我在第一个 for 循环内初始化 boolean 变量 boolean isPrime = true; ,我会得到正确的素数列表。谁能帮我理解为什么 boolean 变量初始化的位置会影响输出?

最佳答案

您需要考虑该变量的含义。我认为这可能意味着“a的当前值为素数吗?”。然后,每次 a 获取一个新值时,您都需要重新开始,并且根据您的方法,将其视为素数,直到您证明它不是素数。

如果您在第一个 for 循环之前初始化它,那么您实际上是在问“到目前为止我看到的 a 的所有值都是素数吗?”。显然,对于 2 和 3 来说这是正确的,但是一旦您评估 4,它就会被设置为 false 并永远保持在那里。

这与变量本身初始化的位置并没有真正的关系。您可以将其保留在原来的位置,只要在进入内部 for 循环之前为它分配一个 true 值即可。重要的一点是 a 的每个值都有机会根据其自身优点进行评估,而不会继承先前值的结果。

所以这会起作用:

public static void main(String[] args) {
    int b;
    boolean isPrime;

    for (int a=2; a<=100; a++)
    {
        isPrime = true;
        for (b=2; b<a;b++)
        {
            if (a%b==0)    
            {
                isPrime = false;
                break;
            }
        }
        if (isPrime)
        {
            System.out.println(a);
        }
    }
}

关于java - 在Java中使用 "for"循环时 boolean 变量的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657143/

相关文章:

java - Java 中对象的动态类型转换

java - Wicket 标记继承不适用于 wicket :child tags within MarkupContainers

java - RestTemplate:无法从 START_OBJECT token 中反序列化 OBJECT 的实例

java - URLClassLoader 不检查 jar

java - 重命名文件(如果存在)

java - 从同一类中的另一个方法访问一个方法 - android

java - 为什么可以将变量赋值给接口(interface)类型?

Java 无法将我的 Total_value 添加到具有 100 个槽的新数组中

java - Ebeans,其中列等于同一个表中的列

java - 使用 SurfaceView 的神秘 LogCat 消息