Java:为什么这个程序使用char而不是int?

问题描述:

我正在学习java,并且在我正在学习的书中遇到了一个示例程序。我决定试验一下,我不明白为什么它不能按预期工作。程序非常简单,它是一个菜单,应该根据用户输入输出一些Java语句的一般形式。代码如下:Java:为什么这个程序使用char而不是int?

public class SimpleMenu { 
public static void main(String args[]) 
    throws java.io.IOException { 
     int choice; 
     do { 
      System.out.println("Help on: "); 
      System.out.println(" 1. IF"); 
      System.out.println(" 2. WHILE"); 
      System.out.println(" 3. DO WHILE"); 
      System.out.println(" 4. FOR"); 
      System.out.println(" 5. SWITCH\n"); 
      System.out.println("Choose one: "); 
      choice = System.in.read(); 
     } while ((choice < 1) || (choice > 5)); 
     System.out.println("\n"); 
     switch (choice) { 
      case 1: 
       System.out.println("if(condition) statement1;\n else statement2;"); 
       break; 
      case 2: 
       System.out.println("while(condition){\n //body of loop \n }"); 
       break; 
      case 3: 
       System.out.println("do{ \n //body of loop \n } while(condition);"); 
       break; 
      case 4: 
       System.out.println("for(initialization; termination; increment/decrement){ \n statement; \n }"); 
       break; 
      case 5: 
       System.out.println("switch(value){\n case 1: \n statement; \n break; \n default:\n statement;\n}"); 
       break; 
     } 
    } 
} 

无论输入什么数字,它都会经过两次do-while循环,并期待再次输入。 这是原来的代码:

public class MenuFromBook { 
public static void main(String args[]) 
     throws java.io.IOException { 
    char choice; 
    do { 
     System.out.println("Help on: "); 
     System.out.println(" 1. if"); 
     System.out.println(" 2. switch"); 
     System.out.println(" 3. while"); 
     System.out.println(" 4. do-while"); 
     System.out.println(" 5. for\n"); 
     System.out.println("Choose one:"); 
     choice = (char) System.in.read(); 
    } while(choice < '1' || choice > '5'); 
    System.out.println("\n"); 
    switch(choice) { 
     case '1': 
      System.out.println("The if:\n"); 
      System.out.println("if(condition) statement;"); 
      System.out.println("else statement;"); 
      break; 
     case '2': 
      System.out.println("The switch:\n"); 
      System.out.println("switch(expression) {"); 
      System.out.println(" case constant:"); 
      System.out.println(" statement sequence"); 
      System.out.println(" break;"); 
      System.out.println(" //..."); 
      System.out.println("}"); 
      break; 
     case '3': 
      System.out.println("The while:\n"); 
      System.out.println("while(condition) statement;"); 
      break; 
     case '4': 
      System.out.println("The do-while:\n"); 
      System.out.println("do {"); 
      System.out.println(" statement;"); 
      System.out.println("} while (condition);"); 
      break; 
     case '5': 
      System.out.println("The for:\n"); 
      System.out.print("for(init; condition; iteration)"); 
      System.out.println(" statement;"); 
      break; 
    } 
} 

但我不明白为什么它必须这样做,为什么不能选择是int和这样的工作吗?我希望我很清楚......

+0

你有什么调试'choice'的价值是,它运行在第二次循环之前? – dunni

+2

使用调试器逐行执行一行代码。不知道如何使用调试器?现在是学习的时候了,因为它是编码的基本要求。 –

+0

读取的输入是字符而不是整数。原始程序将字符与字符“1”进行比较。 你的程序只是比较char值到int'1'。作为输入读取的char值也具有一个int值,该值是该字符的ASCII值。因此它们不匹配。 – inquizitive

System.in.read()从键盘读取ascii字符的输入,并且如果您查看ascii chart,您会看到数字0-9实际上处于48-57。因此,如果您将结果与实际的ASCII代码进行比较,您的代码将正常工作。使用'1'你可以做到这一点:'1'是int 49,所以比较工作。

System.inInputStreamread()-方法读取一个字节的数据。在这种情况下,输入ASCII 1(字节= 49)。尝试打印的选择,看看它的价值,这应该是在49的情况​​下输入1

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read%28%29 http://www.asciitable.com/