可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
While practicing Java I randomly came up with this:
class test
{
public static void main(String arg[])
{
char x='A';
x=x+1;
System.out.println(x);
}
}
I thought it will throw an error because we can't add the numeric value 1
to the letter A
in mathematics, but the following program runs correctly and prints
B
How is that possible?
回答1:
In Java, char
is a numeric type. When you add 1
to a char
, you get to the next unicode code point. In case of 'A'
, the next code point is 'B'
:
char x='A';
x+=1;
System.out.println(x);
Note that you cannot use x=x+1
because it causes an implicit narrowing conversion. You need to use either x++
or x+=1
instead.
回答2:
A char
is in fact mapped to an int
, look at the Ascii Table.
For example: a capital A corresponds to the decimal number 65. When you are adding 1 to that char
, you basicly increment the decimal number by 1. So the number becomes 66, which corresponds to the capital B.
回答3:
char
is a numeric type (2 bytes long), and is also the only unsigned numeric primitive type in Java.
You can also do:
int foo = 'A';
What is special here is that you initialize the char
with a character constant instead of a number. What is also special about it is its string representation, as you could witness. You can use Character.digit(c, 10)
to get its numeric value (as an int
, since 2 ^ 16 - 1 is not representable by a short
!).
回答4:
This is the equivalent program of your program:
public class Tester {
public static void main(String args[]){
char start='\u0041';
char next='\u0041'+1;
System.out.println(next);
}
}
But as you see, next=start+1
, will not work. That's the way java handles.
The reason could be that we may accidentally use start
, with integer 1
thinking that start
is an int
variables and use that expression. Since, java is so strict about minimizing logical errors. They designed it that way I think.
But, when you do, char next='\u0041'+1;
it's clear that '\u0041'
is a character and 1
will be implicitly converted into a 2 byte. This no mistake could be done by a programmer. May be that's the reason they have allowed it.
char
is 2 bytes in java. char
supports unicode
characters. When you add or subtract a char var with an offset integer, the equivalent unicode
character in the unicode table will result. Since, B
is next to A
, you got B
.
回答5:
A char
in Java is just an integer number, so it's ok to increment/decrement it. Each char number has a corresponding value, an interpretation of it as a character, by virtue of a conversion table: be it the ASCII encoding, or the UTF-8 encoding, etc.
Come to think of it, every data in a computer - images, music, programs, etc. are just numbers. A simple character is no exception, it's encoded or codified as a number, too.
回答6:
char
are stored as 2 byte unicode values in Java. So if char x = 'A'
, it means that A
is stored in the unicode format. And in unicode format, every character is represented as an integer. So when you say x= x+1
, it actually increments the unicode value of the A
, which prints B
.
回答7:
you have to type cast the result after adding using parenthesis like this:
x='A';
x = (char) (x+1);
else you will get loose of data error.
回答8:
Because type char effectively works like a 16-bit unsigned int.
So setting char x='A'
is almost equivalent to int x=65
When you add one; you get 66; or ASCII 'B'.
回答9:
Each char
has a character code. The computer sees a character as an unsigned number, so you can increment it.