为什么我的char打印为数字而不是字符?

摇摆

按照Java三元运算符expression ? statement1 : statement2,如果expression为true,statement1则将执行;如果expression为false,statement2则将执行。

但是当我跑步时:

// some unnecessary codes not displaying
char y = 'y';
int i = 0;
System.out.print(false ? i : y);

我希望它可以打印,y但是121为什么要打印呢?

编辑根据manouti的答案,编译器将解释为int,但是如果是这种情况,那为什么我会看到死代码i

如果我这样做了,System.out.print(false ? 0 : x);那我y就明白,为什么在这种情况下编译器不解释为int

天蓝色的青蛙

对于您的问题的简短答案是,所打印的值基于条件表达式求值的类型。

所以实际上您的问题归结为,为什么条件表达式的类型之间

char y = 'y';
int i = 0;
System.out.print(false ? i : y); // prints 121

char y = 'y';
System.out.print(false ? 0 : y); // prints y

要回答这个问题,我们需要看一下Java语言规范§15.25节

Java中有三种类型的条件表达式:

  • 布尔条件表达式
  • 数值条件表达式
  • 参考条件表达式

由于intchar均可转换为数字类型,因此该表达式是根据以下规则数字条件表达式的示例

如果第二和第三操作数表达式均为数字表达式,则条件表达式为数字条件表达式。

为了对条件进行分类,以下表达式是数字表达式:

  • 独立形式(第15.2节)的表达式,其类型可转换为数字类型(第4.2节,第5.1.8节)。

鉴于此,确定整个表达式类型的规则如下:

15.25.2。数值条件表达式

数值条件表达式是独立表达式(第15.2节)。

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

  • 如果第二和第三操作数具有相同的类型,则这是条件表达式的类型。

  • 如果第二个操作数和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,则条件表达式的类型为T。

  • 如果操作数之一是字节或字节类型,而另一个是short或Short类型,则条件表达式的类型为short。

  • 如果其中一个操作数的类型为T,其中T为字节,short或char,而另一个操作数为int类型的常量表达式(第15.28节),其值可在类型T中表示,则条件表达式的类型为T.

  • 如果其中一个操作数是T类型,其中T是Byte,Short或Character,而另一个操作数是int类型的常量表达式,其值可表示为U类型,这是对T应用拆箱转换的结果,那么条件表达式的类型是U。

  • 否则,将二进制数值提升(第5.6.2节)应用于操作数类型,条件表达式的类型为第二和第三操作数的提升类型。

请注意,二进制数值提升执行值集转换(第5.1.13节),并且可能执行拆箱转换(第5.1.8节)。

注意,第四条规则准确地描述了第二个示例。第二个操作数是int0类型的常量,第三个操作数是a的常量char,因此条件表达式的值为char这将导致编译器使用print(char)方法print y

但是,当您改为传入变量而不是常量时,您会陷入最后一条规则,即“ ...条件表达式的类型是第二和第三操作数的提升类型”。

如果您查看JLS的§5.6.2部分,它将描述类型提升的规则,如下所示:

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用:

  1. 如果任何操作数是引用类型,则将其进行拆箱转换(第5.1.8节)。

  2. 扩展原语转换(第5.1.2节)适用于转换以下规则指定的一个或两个操作数:

    • 如果一个操作数的类型为double,则另一个将转换为double。

    • 否则,如果其中一个操作数的类型为float,则另一个将转换为float。

    • 否则,如果其中一个操作数的类型为long,则另一个将转换为long。

    • 否则,两个操作数都将转换为int类型。

遵循这些规则,表达式的类型将为int,因此编译器将使用该print(int)方法进行打印121(的ascii值y)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么strlen与s的大小不同,为什么cout char显示的字符不是数字?

为什么调用cout.operator <<(const char *)打印地址而不是字符串?

为什么打印char *会给出字符串而不是地址?

为什么我打印的是 Hp 而不是空行?

为什么我要打印出“ System.Int32 []”而不是数字数组?

为什么我的函数打印为“ 0”?

char 数组中的数字打印为随机字符

为什么这个打字稿函数假设我传递的是字符串而不是数字

为什么此javascript循环打印出数字而不是选项?

尝试绘制mpmath.pcfd时,为什么为什么我的'float()参数必须是字符串或数字,而不是'mpc'?

为什么我不能将不可打印字符定义为常量C#

为什么 al_draw_textf() 打印数字而不是存储在字符串变量中的字母?

为什么我的编译器将字符串理解为const char []?

为什么Java将char打印为整数?

为什么我在Excel中将数字值读取为字符串

为什么我的程序为什么将数组中的数字打印为零,但仍然从数组中打印出最大值?

为什么此打印为1,而不是星期三?

为什么将HTML代码打印为字符串会给出十六进制数字作为python输出?

为什么我的 C 代码打印额外的数字?

为什么我的代码打印文本所需的数字?

为什么我的代码打印出这么大的数字?

为什么我的代码打印每个数字?

为什么我的冒泡排序实现会打印额外的数字?

为什么我的代码没有打印最大的数字?

为什么我的方法打印null而不是数组?

char[][]和char**的区别,为什么puts(strings[0])不能打印(strings定义为char**strings)

为什么我可以在函数后返回“ int”而不是“ char *”?

为什么字符串转换不是数字促销的类型?

为什么我的阵列打印的数字与分配过程中打印的数字不同?