为什么System.out.println()中没有字符增量?

char char1 = 'a'; System.out.println(char1); //prints char 1 System.out.println(char1+1); //prints char 1 System.out.println(char1++); //prints char 1 System.out.println(char1+=1); //prints incremented char1 char1 += 1; System.out.println(char1); //prints incremented char1 

在上面,为什么不(char1 + 1)或(char ++)打印增加的字符,而另外两个呢?

首先,我假设因为你说System.out.println的增量有效,你真的指定了:

 char char1 = 'a'; 

编辑

为了回应问题的变化( char1+1; => char1 += 1; ),我看到了问题。 输出是

 a 98 b 

98显示,因为char a被提升为int (二进制数字提升)以添加1.因此a变为97( 'a'的ASCII值)和98结果。

但是, char1 += 1; 或者char1++不执行二进制数字提升,因此它按预期工作。

引用JLS,第5.6.2节“二进制数字促销” :

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

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

否则,如果任一操作数的类型为float,则另一个操作数转换为float。

否则,如果任一操作数的类型为long,则另一个操作数转换为long。

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

(强调我的)

您没有将char1+1的加法结果赋给char1 。 所以

char1 = char1 + 1;

要么

char1 += 1; char1++; 是正确的。

好的,首先,修复代码的格式:

 char char1; char1 = 'a'; System.out.println(char1); // print 1 System.out.println(char1 + 1); // print 2 char1 += 1; System.out.println(char1); // print 3 

产生输出:

 a 98 b 

现在,让我们看一下println()的每次调用:

1:这只是取名为char1的字符句柄并打印出来。 它被分配了字母a(注意分配中a的单引号,表示字符)。 毫不奇怪,这打印出角色a。

2:对于此行,您正在执行整数加法。 java中的char作为unicode字符保存。 字母a的unicode值映射到数字97.(请注意,这也对应于a的ASCII值)。 当在不匹配的类型之间执行Java中的算术运算时,较小/不太精确的值类型的值将被“升级”为较大的类型(这是非常不精确的陈述)。 因此,在执行添加之前将char“升级”为int,结果也是int。 考虑到这一点,从+1开始的97导致98被打印就不足为奇了。

3:在这种情况下,我们再次打印char的值,因此打印一个字符。 这次我们看到之前生成的98被隐式地转换一个角色。 同样,毫无疑问,a的下一个最高数字映射是b,所以我们看到ab打印。

尝试这个。

 System.out.println(char1); System.out.println(++char1); char1 += 1; System.out.println(char1); 

代替

 char1 = a; System.out.println(char1); system.out.println(char1+1); char1 += 1; System.out.println(char1);