-3
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++) 不打印递增的字符,而其他两个打印呢?

4

4 回答 4

8

首先,我假设因为您说System.out.println工程中的增量,所以您确实指定了:

char char1 = 'a';

编辑

针对问题的变化(char1+1;=> char1 += 1;),我看到了这个问题。输出是

a
98
b

之所以98出现,是因为 chara被提升为int(二进制数字提升)以添加 1。因此a变为 97(的 ASCII 值'a')和 98 结果。

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

引用JLS,第 5.6.2 节,“二进制数字提升”

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

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

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

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

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

(强调我的)

于 2013-09-06T01:09:59.223 回答
1

您没有将加法的结果分配char1+1char1. 所以

char1 = char1 + 1;

或者

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

于 2013-09-06T01:07:54.283 回答
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:对于这一行,您正在执行整数加法。java中的char被保存为unicode字符。字母 a 的 unicode 值映射到数字 97。(请注意,这也对应于 a 的 ASCII 值)。在 Java 中在不匹配的类型之间执行算术运算时,较小/不太精确的值类型的值将被“升级”为较大的类型(这是非常不精确的说明)。因此,在执行加法之前,char 被“升级”为 int,结果也是 int。考虑到这一点,+1 中的 97 导致打印 98 也就不足为奇了。

3:在本例中,我们再次打印 char 的值,因此打印了一个字符。这次我们之前看到的 98 被隐式地转换一个字符。同样,不出所料,从 a 映射的下一个最高数字是 b,所以我们看到打印了 ab。

于 2013-09-06T01:27:22.493 回答
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);
于 2013-09-06T01:19:35.830 回答