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 ++)打印增量字符,但另外两个呢?
答案 0 :(得分:7)
首先,我假设这是因为你说System.out.println
中的增量有效,你确实指定了:
char char1 = 'a';
修改强>
针对问题的更改(char1+1;
=> char1 += 1;
),我看到了问题。
输出是
a
98
b
98
显示,因为char a
被提升为int
(二进制数字促销)以添加1.因此a
变为97(ASCII值为'a'
)和98个结果。
但是,char1 += 1;
或char1++
不执行二进制数字促销,因此按预期工作。
引用JLS, Section 5.6.2, "Binary Numeric Promotion":
扩展基元转换(第5.1.2节)用于转换或 两个操作数由以下规则指定:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则转换另一个操作数 漂浮。
否则,如果任一操作数的类型为long,则转换另一个操作数 很久。
否则,两个操作数都转换为int 。
(强调我的)
答案 1 :(得分:1)
您没有将加法char1+1
的结果分配给char1
。所以
char1 = char1 + 1;
或
char1 += 1;
char1++;
是对的。
答案 2 :(得分:1)
好的,首先,修复代码的格式:
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:对于此行,您正在执行整数加法。 char in java被保留为unicode个字符。字母a的unicode值映射到数字97.(请注意,这也对应于a的ASCII值)。当在不匹配类型之间执行Java中的算术运算时,较小/不太精确的值类型的值将被“升级”为较大类型(这是非常不精确地说明的)。因此,在执行添加之前将char“升级”为int,结果也是int。考虑到这一点,从+1开始的97导致98被打印就不足为奇了。
3:在这个例子中,我们再次打印char的值,因此打印一个字符。这次我们看到之前生成的98是隐式地将返回转换为一个字符。同样,不出所料,a的下一个最高数字映射是b,所以我们看到b打印。
答案 3 :(得分:0)
试试这个。
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);