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

在Java中的三元运算符中的char转换,打印int值而不是char值

邢乐
2023-03-14

在Java中,可以使用char值或ASCII值将char转换为int,反之亦然。如果将int变量强制转换为char,则会得到相应的字符。因此,以下代码段将打印“a”:

int x = 97;
System.out.println( (char)x ); // 'a'

但当我这么做的时候:

char ch = 'a', ch2 = 97, ch3 = 'b';
System.out.println( ( (ch+=1) > ch2 ) ? (char)ch2 : (int)ch3 );

编译器输出int值97,而不是'a',即使'true side'上的三元运算符返回值是(char)ch2。所以我期待的是“a”,而不是97。为什么它打印97而不是'a'?

共有1个答案

赵才俊
2023-03-14

问题在于:

System.out.println(((ch += 1) > ch2) ? (char) ch2 : (int) ch3);

因为您有(int)ch3,编译器假定三元运算符的返回类型将是int

检查JLS 15.25中规则的突出显示部分。条件运算符?:

条件表达式的类型确定如下:

>

  • 如果第二个和第三个操作数具有相同的类型(可能是null类型),则这就是条件表达式的类型。

    如果第二个和第三个操作数中的一个是基元类型T,而另一个的类型是对T应用装箱转换(§5.1.7)的结果,则条件表达式的类型是T。

    如果第二个和第三个操作数中的一个是空类型,而另一个操作数的类型是引用类型,那么条件表达式的类型就是该引用类型。

    否则,如果第二个和第三个操作数具有可转换的类型(§5.1.8)到数字类型,那么有几种情况:

    >

  • 如果其中一个操作数是byte或Byte类型的,另一个是短或短类型的,那么条件表达式的类型是短的。

    如果其中一个操作数是T类型的,其中T是byte、短或char,而另一个操作数是int类型的常量表达式(§15.28),其值可在T类型中表示,那么条件表达式的类型是T。

    如果其中一个操作数是T类型的,其中T是Byte、短期或Character,而另一个操作数是int类型的常量表达式(§15.28),其值可在类型U中表示,类型U是对T应用拆箱转换的结果,那么条件表达式的类型是U。

    否则,二进制数字提升(§5.6.2)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

    请注意,二进制数字升级执行值集转换(§5.1.13)并可能执行取消装箱转换(§5.1.8)。

    否则,第二个和第三个操作数分别为S1和S2类型。设T1为将装箱转换应用于S1时产生的类型,设T2为将装箱转换应用于S2时产生的类型。

    如果你这样做

    System.out.println(((ch += 1) > ch2 ) ? (char) ch2 : (char) ch3);
    

    它会打印出来的

    'a'
    

    或者,您可以应用蛮力,即将最终结果转换为char,如下所示:

    System.out.println((char) (((ch += 1) > ch2 ) ? (char) ch2 : (int) ch3));
    

    它也会打印出来

     'a'
    

  •  类似资料:
    • 问题内容: 下面是一个代码片段, 但是我得到的是空输出。 我将得到1作为输出。 有人可以解释吗?如果我想像第一个代码片段一样将int转换为char,该怎么办? 问题答案: 会打印出ascii值为1的字符(首字符,这是不可打印的)。 将以ascii值49输出一个字符(一个对应于“ 1”) 如果要转换数字(0-9),则可以将数字加48并进行转换,例如;。 如果要转换 as asi的ascii值,可以使

    • 下面是一段代码片段, 但我得到的是空输出。 我将得到1作为输出。 有人能解释一下吗?如果我想像第一个代码片段那样将int转换成char,我应该怎么做?

    • ______________________________________。 我让程序使用这段代码,但现在我需要设置while循环。这是我当前的代码。 字符串word=“”;扫描仪键盘=新扫描仪(System.in); 我的while循环如何描述这个输出?

    • 问题内容: (我是Java编程的新手) 我有例如: 我需要在撇号中得到数字9本身。我尝试执行以下操作 但这没用。 那么我该怎么做才能得到撇号呢? 问题答案: ASCII表的排列方式是使字符的值比的值大九;字符的值比的值大8 ; 等等。 因此,您可以通过减去以获得十进制数字char的int值。

    • 问题内容: 当我运行以下代码时,我得到了数组的地址: 但是,当我声明一个字符数组并以相同的方式打印它时,它将为我提供数组的实际内容。为什么? 问题答案: 类(即类)具有专用的方法重载,可打印char数组的字符。 对于其他数组,它没有特殊的重载,因此,当您传递时,被调用的方法是。该方法通过调用其方法将传递的对象转换为字符串。 所有数组的方法都只是从class继承的默认数组,它显示了它们的类名和默认哈