当前位置: 首页 > 知识库问答 >
问题:

为什么在输出过程中字符值会发生变化?

钦侯林
2023-03-14

我正在制作我的程序,为JavaSE的学校作业扔一个骰子(如骰子)。用户可以将一个字符作为标准输入,因此用户选择的字符将代表骰子的眼睛。有时当我打印结果时,它会显示一个完全不同的字符。

package ThrowADie;
import java.util.Scanner;

public class ThrowADie {

public static void main(String[] args) {

    //Ask user for the char in which the dices eyes should be printed in.
    System.out.print("Which character should I use for the eye: ");

    //Allow user to place input in the eye variable
    Scanner input = new Scanner(System.in); //Make the stdinput object
    char eye = input.next().charAt(0);

    //Time to throw the die. Place result in dieResult
    int dieResult = throwDie();

    //Reveal of the result
    printDieResult(dieResult, eye);

}


    /*
    * Method name: throwDie()
    * Purpose: Picks a number from 1 to 6 randomly, like a die does
    * Parameters: N/A
    * Returns: Integer number from 1 to 6    
    */
    public static int throwDie(){
        int range = (6 - 1) + 1;     
        return (int)(Math.random() * range) + 1;
    }


    /*
    * Method name: printDieResult()
    * Purpose: Generate result of the die throw in ASCII art
    * Parameters: numberOfEyes, typeOfEyes
    * Returns: N/A
    */
    public static void printDieResult(int numberOfEyes, char typeOfEyes){
        if (numberOfEyes == 1){
            //Print art
            System.out.println(
                    " " + " " + " \n"
                  + " " + typeOfEyes + " \n"
                  + " " + " " + " ");
        } else if (numberOfEyes == 2){
            //Print art
            System.out.println(
                    typeOfEyes + " " + " \n"
                  + " " + " " + " \n"
                  + " " + " " + typeOfEyes);
        } else if (numberOfEyes == 3){
            //Print art
            System.out.println(
                    typeOfEyes + " " + " \n"
                  + " " + typeOfEyes + " \n"
                  + " " + " " + typeOfEyes);
        } else if (numberOfEyes == 4){
            //Print art
            System.out.println(
                    typeOfEyes + " " + typeOfEyes + "\n"
                  + " " + " " + " \n"
                  + typeOfEyes + " " + typeOfEyes);
        } else if (numberOfEyes == 5){
            //Print art
            System.out.println(
                    typeOfEyes + " " + typeOfEyes + "\n"
                  + " " + typeOfEyes + " \n"
                  + typeOfEyes + " " + typeOfEyes);
        } else {
            //Print art
            //Accidentally written down 9 eye representation
            System.out.println(
                    typeOfEyes + typeOfEyes + typeOfEyes + "\n"
                  + typeOfEyes + typeOfEyes + typeOfEyes + "\n"
                  + typeOfEyes + typeOfEyes + typeOfEyes);
        }
    }
}

输出此程序将生成正确的结果。但偶尔输入的字符(代表模具的眼睛)会转换为数字。

在以下情况下,程序应打印9个“@”字符。相反,它在第一行打印192。(我知道骰子有6只眼睛,但我在无意中打印了9只眼睛时遇到了这个奇怪的输出)

run:
Which character should I use for the eyes: @
192
@@@
@@@

我找不到原因,有人能看出我做错了什么吗?

共有2个答案

濮阳和泰
2023-03-14
int test = (int) (typeOfEyes + typeOfEyes + typeOfEyes);

        System.out.println("\n" + test + "\n"
                + typeOfEyes + "" + typeOfEyes + "" + typeOfEyes + "\n"
                + typeOfEyes + "" + typeOfEyes + "" + typeOfEyes + "\n"
                + typeOfEyes + "" + typeOfEyes + "" + typeOfEyes);

Which character should I use for the eye: @

192
@@@
@@@
@@@
古刚洁
2023-03-14

字符算术!

请参阅此表<代码>@是字符<代码>64

typeofees-typeofees-typeofees“\n”

第一行实际上是将字符(64 64 64) = 192的值相加,然后用换行符将其相加,因此我们得到192\n

编译器选择将它们相加而不是创建字符串。解决这个问题的简单方法是在前面加上一个空字符串:"typeOfEyes...

基本上,编译器是“愚蠢的”。当我们将整数添加到String时,"foo"123编译器可以将其解释为fo123很好,因为它将第一个元素识别为String。但是,我们定义了一个char,它是表示字符的数字类型。所以编译器会对其进行数学运算。即使我们不应该这样做。添加字符串文字告诉它我们实际上需要文本。

 类似资料:
  • 问题内容: 当我执行以下代码时,输​​出为“ nullHelloWorld”。Java如何处理null? 问题答案: 您正在尝试将值连接到。这由“字符串转换”控制,当一个操作数是a时发生,该转换被JLS的5.1.11节覆盖: 现在只需要考虑参考值: 如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。

  • 以下代码在C 14中被认为是非法的,但在C 17中是合法的: 不要费心测试它,你会得到不一致的结果,很难确定这是一个错误还是故意的行为。但是,比较两个草案(N4140 vs N4527,都可以在github.com/cplusplus/draft上找到),[func.wrap.func.inv]有一个显著的区别。第2段: 返回:如果R为空,则无,否则返回值INVOKE(f, std::forwar

  • 我不明白为什么< code>gcc -S -m32会产生这些特定的代码行: C 代码: 它给出以下输出:

  • Python中的字符串是不可变的,这意味着该值不能更改。我正在测试该场景,但看起来原始字符串已被修改。我只是想理解这个概念

  • 问题内容: 应用Webkit过滤器时,我发现堆叠顺序出现了一个奇怪的问题。为什么当我将鼠标悬停在图像上时,堆叠顺序会改变吗? 我宁愿不必使用z-indexing来解决此问题,因为它会破坏其他站点元素。 请原谅荷马,我只需要一张图片。 编辑:如何才能反转效果以阻止隐藏绝对位置div? 这是我的HTML CSS 问题答案: 这是因为除了建立堆栈上下文以外的其他值。 规范中 对此进行了记录(当前处于工作

  • 我是java初学者,我对上述程序的输出感到困惑。请给我解释一下输出的原因。