1

在用 C++ 编程几个月并达到中级水平后,我决定开始学习 Java。我在理解扫描仪变量的工作方式时遇到了一些麻烦。在 C++ 中,“cin>>”非常简单,因为它将输入的任何内容存储到先前声明的变量中。但是,在 Java 中,变量本身就是扫描器?这是如何运作的?此外,在告诉扫描仪将变量存储在哪里之后,使用“.nextDouble”的目的是什么?我是从教程中学到的,下面是我的代码。

import java.util.Scanner;
class calculator {
 public static void main(String args[]) {
     Scanner var = new Scanner(System.in);
     double fnum, snum, answer;
     System.out.println("Enter first number: ");
     fnum = var.nextDouble();
     System.out.println("Enter second number: ");
     snum = var.nextDouble();
     answer = fnum+snum;
     System.out.println(answer);


 }
     }
4

6 回答 6

5
  Scanner var = new Scanner(System.in);

此时将不会读取值。假设这样在控制台和您的程序之间打开一个流(或)管道。

fnum = var.nextDouble();

告诉 JVM,现在double从名为var(java terminology, reference) 的流中获取下一个可用值并将该值存储到fnum.

于 2012-12-31T19:33:46.090 回答
4

var是对一个Scanner 对象的引用,该对象有助于抽象从源(在本例中为默认输入流System.in)读取标记化输入。

调用.nextDouble()等待输入值(例如,从提示符或通过管道传输到标准输入)。一旦输入,该值将存储在分配的属性中(即fnumsnum)。

如果该值不可解析为 a doubleInputMismatchException则会抛出 an 。

这是您的源代码的简要注释版本,它解释了正在发生的事情:

 // Create a new Scanner object that will read input from System.in (stdin).
 Scanner var = new Scanner(System.in);

 // Declare some variables. The scanner hasn't done anything significant yet.
 double fnum, snum, answer;

 // Print a line to stdout.
 System.out.println("Enter first number: ");

 // Block until the scanner (i.e. stdin) receives a token. By default, the
 // Scanner will use whitespace to tokenize anything that comes in on
 // System.in. nextDouble() will try to parse the first available token
 // into a double. If the parsing succeeds, assign the parsed value to fnum.
 fnum = var.nextDouble();

 // Same thing as above, but for snum.
 System.out.println("Enter second number: ");
 snum = var.nextDouble();

 ...

通读 Scanner 的类文档以帮助提供有关 Scanner 是什么以及它如何工作的一些上下文可能不会有什么坏处。

于 2012-12-31T19:33:40.690 回答
2

调用var.nextDouble()会导致double从输入中读取下一个值并返回其值。然后,您需要将值存储在某处(或者不存储,如果您只想将其丢弃)。没有地方可以“告诉扫描仪存储变量的位置”。

于 2012-12-31T19:34:21.643 回答
2

在“中级”了解 C++ 的人应该知道:cin是全局变量,>>是伪装成运算符的方法调用,“变量”是该方法调用的引用参数。

在 Java 中没有不合格的全局变量,方法调用遵循object.method(params)格式,也没有传递引用。

于 2012-12-31T20:42:25.063 回答
1

nextDouble() 是 Scanner 类的一个方法,它返回下一个扫描的双精度。基本上,类 Scanner 正在为您做 cin 类型的东西,但您看不到它的内部工作原理。就好像您在 C++ 中编写了一个类来为您处理 cin,而现在您只是在使用该类。

于 2012-12-31T19:33:34.190 回答
1

在这里,作为初学者,您感到困惑是可以的。首先是我们为什么使用scanner?。我们scanner class在程序想要获取user input. 就像程序问你“你叫什么名字?” 你输入彼得。然后程序可以回复你“你好Peter!”。在那里你输入你的名字,这是一个字符串值,当你使用扫描仪时,你会得到用户输入,你需要变量来存储这些输入。您可以说“名称”是变量。因此,您输入的任何名称都将存储在名称变量中。现在系统如何接受您的特定答案?为此,我们使用了一些方法。string我们将使用, var.next()-- double> var.nextDouble(), int----> nextInt(),

扫描仪引用变量名称中的位置varScanner var = new Scanner(System.in);

在您的示例中,您期望双精度值作为用户输入,这就是您说JVM要获得下一个双精度值的原因。

于 2014-10-08T13:31:40.143 回答