Проблема с циклом в Java - PullRequest
3 голосов
/ 15 июня 2010

В чем ошибка в следующем коде?

 while ((char t==(char) System.in.read())!='0')

Ответы [ 4 ]

8 голосов
/ 15 июня 2010

Нельзя объявить новую переменную в цикле while.

    while (boolean always = true) {
    } // DOES NOT COMPILE!!!

Вы должны объявить переменную до и вне цикла, так что, возможно, что-то вроде этого:

    boolean always = true;
    while (always) {
        break;
    } // compiles fine!

    // always is still in scope after the loop!
    always = !always;

В этом смысле цикл for уникален: фактически вы можете объявить новую локальную переменную, область действия которой ограничена этим циклом:

    for (boolean always = true; always; ) {
        break;
    } // compiles fine!

    // always is no longer declared after the loop!
    always = !always; // DOES NOT COMPILE!

Тем не менее, глядя на то, что вы делаете, вы можете посмотреть на java.util.Scanner. Я подозреваю, что это будет служить вашим потребностям гораздо лучше.


Пример

Вот пример использования Scanner для чтения чисел со стандартного ввода, оканчивающихся на 0. Затем он печатает сумму этих чисел. Он корректно обрабатывает некорректный ввод, используя hasNextInt() вместо Integer.parseInt / NumberFormatException.

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter numbers (0 to end):");
    int sum = 0;
    int number;
    do {
        while (!sc.hasNextInt()) {
            System.out.println("I'm sorry, that's not a number! Try again!");
            sc.next();
        }
        number = sc.nextInt();
        sum += number;
    } while (number != 0);
    System.out.println("The sum of those numbers is " + sum);

Вот пример сеанса:

Enter numbers (0 to end):
1
3
-1
five
I'm sorry, that's not a number! Try again!
2
0
The sum of those numbers is 5

7 голосов
/ 15 июня 2010

Это, вероятно, то, что вы намеревались написать.

char t;
while ((t = (char) System.in.read()) != '0') {
    //...
}
6 голосов
/ 15 июня 2010
 while ((char t==(char) System.in.read())!='0')
 //            ^^  should be 'char t = ...'

Этот цикл может быть переписан более четко как

 while (true) {
    char t = (char) System.in.read();
    if (t == '0')
      break;
    ...
3 голосов
/ 15 июня 2010

char t - это оператор, который объявляет переменную, а не выражение; он не имеет значения для сравнения с оператором ==. Вы, вероятно, также хотели использовать присваивание, а не равенство, но в отличие от C ++, объявление не имеет значения.

Самый простой способ ограничения области видимости переменной в цикле - использовать вместо нее for, что, в частности, позволяет объявлять переменные.

for (char t; ( t = (char) System.in.read() ) != '0'; )
   // loop body involving t

Тем не менее, руководящие принципы некоторых компаний не допускают изменения операторов в логических выражениях, таких как чтение и присвоение, и предпочитают разделять их на несколько строк. Лично я считаю, что ограничение объема более важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...