2013-09-06 2 views
-2
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()에서 문자가 증가하지 않는 이유는 무엇입니까?

+3

이것은 유효한 Java가 아닙니다. -1 – Doorknob

+0

일단 코드가 올바르게 (컴파일 가능하게) 포맷되면, 그것은 나를 위해 잘 작동합니다 .. – MadProgrammer

+0

그건 오타 였고, 그것은 제 코드에 있습니다. –

답변

7

첫째, 난 당신이, System.out.println 작품에서 증가 말 때문에 당신이 정말로 지정했는지 있으리라 믿고있어 :

char char1 = 'a'; 

편집 질문의 변화에 ​​대응하여

을 (char1+1; =>char1 += 1;) 문제가 있습니다. 숯 aint (이진 숫자 프로모션)으로 승진 때문에 출력이 1을 추가

a 
98 
b 

98가 도시되어 그래서 a 97 ('a'위한 ASCII 값) 및 98의 결과가된다.

그러나 char1 += 1; 또는 char1++은 이진 숫자 승격을 수행하지 않으므로 예상대로 작동합니다.

피연산자는 두 유형의 경우 : JLS, Section 5.6.2, "Binary Numeric Promotion" 인용

: 다음의 규칙에 의해 지정된

넓히는 기본 변환 (§5.1.2)이 있거나, 두 피연산자 변환인가 , 다른 하나는 double로 변환됩니다.

그렇지 않으면 두 피연산자 중 하나가 float 유형 인 경우 다른 하나는 float으로 변환됩니다 ( ).

그렇지 않으면 피연산자 중 하나가 long 유형이면 다른 하나는 으로 변환됩니다.

그렇지 않은 경우 두 피연산자는 모두 유형으로 변환됩니다.

(강조 광산)

+0

음 +1에서 숫자를 설명하지만, 내 다른 문제는 ... char ++ 그냥 아무 것도하지 않는 것, 만약 내가 char + a를 입력하면 char가, 그냥 인쇄하지만 char + ++; * 전에 * 내가 println 할, 그것은 작동합니다. –

+0

사후 증가 연산자가 수행하는 작업입니다. 값은 증가하지만 표현식의 값은 _old_ value, 'a'입니다. – rgettman

+0

OH! 알겠지만 사전 증분을 사용해야합니다. 권리. 감사합니다 :) 나는 그 작은 뉘앙스를 완전히 잊었다. –

1

char1+1의 결과를 char1에 할당하지 않았습니다. 그래서

char1 = char1 + 1;

또는

char1 += 1; char1++;

는 정확합니다.

+0

아마도 그들이 왜 올바른지에 대한 설명을 제공해야합니다. :) 그리고 그의 코드가 틀린 이유는 무엇입니까? –

+0

물론 당신이 왜 당신의 것이 옳고 그 사람이 틀린 지 설명 할 수 없다면 ... –

+0

죄송합니다. 질문자의 어리석은 논평이지만 삭제되었습니다. – qsona

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); 
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 

을하자 deta에서 println()을 호출 할 때마다 il :

1 : 이것은 char1이라는 문자 핸들을 가져 와서 인쇄하는 것입니다. 편지에 a가 지정되었습니다 (문자를 나타내는 과제에서 a 주위에 작은 따옴표를 적어주십시오). 놀랍지 않게, 이것은 a를 인쇄합니다.

2 :이 행의 경우 정수를 추가하고 있습니다. char in javaunicode 문자로 유지됩니다. 문자 a에 대한 유니 코드 값은 숫자 97에 매핑됩니다 (이 또한 a에 해당하는 ASCII 값에 해당합니다). 일치하지 않는 유형간에 Java에서 산술 연산을 수행 할 때 더 작은/덜 정확한 값 유형의 값은 더 큰 유형으로 '업그레이드'됩니다 (이는 매우 부정확하게 설명됩니다). 이 때문에, char는, 추가가 실행되기 전에 int에 '업그레이드'되어 결과는 int가됩니다. 이를 염두에두고, +1에서 97이 나오면 98이 인쇄된다는 것은 놀라운 일이 아닙니다.

3 :이 경우 다시 char 값을 인쇄하므로 문자가 인쇄됩니다. 이 시간에 생성 된 98은 암시 적으로 문자로 캐스팅합니다. 다시 말하지만, 놀랍지 않게 a에서 다음으로 높은 숫자 매핑은 b이므로 b가 인쇄 된 것을 볼 수 있습니다.

관련 문제