你的程序有一个编译器抱怨的 Java 语法错误,以及一个更微妙的逻辑错误,即使在整个 C/C++/C#/Java 系列的有经验的程序员中也很常见。
语法错误是您使用的那种for需要您在冒号后指定一个集合;或者,更准确地说,是实现接口Iterable的类型的对象。接口定义了一个契约,它授权编译器对实现接口的类的实例执行某些操作。因此,只有当变量是Iterable时,编译器才会处理对变量的迭代。由于在您的情况下rolls是int类型(因此甚至不是类)并且int不是Iterable,因此您会收到错误消息。
您使用经典的 for对整数进行迭代,在 C、C++、C# 和 Java 中几乎都支持它,没有任何区别。
for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
/* A single statement (body) */;
该语句的意思是:重复body,即for (...)之后提到的单个语句,正好滚动次数。更准确地说,它实现了以下算法:
A. Initialize num1 to 0
B. Is num1 lesser than rolls?
If yes, execute the body, increment num1 and go back to B
If not, go to the first instruction after the **for**
现在,第二个问题;这可能发生在 for 的两种风格中,但Iterable风格不太可能被忽视。您很可能不希望在for语句之后使用分号;这就是为什么。对于 C 和所有具有类似 C 语法的语言(如 Java)的设计决策是,在大多数要插入一条或多条语句的地方,实际上只能插入一条语句。for循环只能处理其主体中的一条指令,它将是 ) 之后的一条指令,不考虑缩进和编码风格。考虑以下两个循环:
// Prints numbers from 0 to 9
int x = 0;
for (x = 0; x < 10; x = x + 1)
System.out.println(x);
// Prints 10
int y = 0;
for (y = 0; y < 10; y = y + 1);
System.out.println(y);
它们看起来很相似,但是第一个代码片段的效果是打印从 0 到 9 的数字,而第二个代码片段的效果是打印 10。原因是第二个 for 的主体实际上是一个空语句。您可以像这样重写两个 * for *s:
int x = 0;
for (x = 0; x < 10; x = x + 1)
System.out.println(x);
int y = 0;
for (y = 0; y < 10; y = y + 1)
/* Lalala... does nothing at all... */;
System.out.println(y); // When control flow gets here, y equals 10
要在for中放置多个语句,您必须使用块,它是由许多语句组成的语句。对初学者的误导是,块不必与for相关联,实际上可以单独存在。Java中的以下代码是合法的:
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
当您将 a for which 错误地包含在末尾时:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
你基本上是在说:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1)
/* Lalala... does nothing at all... */;
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
因此,您的 for 没有执行任何确切的滚动时间,然后它执行一次 block 语句。有时,由于 a for的主体会引用迭代变量num1 ,这样的错误会得到缓解,但这不是你的情况。考虑:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
Console.out.println("Roll No. " + num1);
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
这有 ; 问题,但编译器检测到有问题,因为您在块语句中使用num1,但由于 ; block 语句与for无关,因此num1超出范围。以下虽然具有相同的逻辑错误,但不会导致编译器错误:
for (int num1 = 0; num1 < rolls; num1 = num1 + 1);
{
num = generator.nextInt(sides);
System.out.println("You rolled a " + num);
}
注意:您的while也有类似的额外问题;特点。