Java-char, konwersje int

W języku Java dozwolone jest:

char c = 'A' + 1;

Tutaj c będzie zawierać wartość 'B'. Powyżej, najpierw zostanie ocenione wyrażenie. Tak więc 'A' jest konwertowane na 65, całe wyrażenie jest ewaluowane na 66, a następnie 66 jest konwertowane na' B', ponieważ przechowujemy wartość w znaku.

Poniższy błąd daje czas kompilacji:

char c = 'A';
c = c + 1;

Jakie jest wyjaśnienie, jak Java inaczej postrzega wyrażenia? przy okazji, następujące działa dobrze też:

char c = 'A';
c++;
Author: Radiodef, 2014-01-23

4 answers

Pierwszy przykład (który kompiluje) jest szczególny, ponieważ oba operandy dodawania są literałami.

Kilka definicji na początek:

  • Przekształcenie an int na char nazywa się zawężanie nawrócenia prymitywnego, ponieważ char jest typem mniejszym od int.

  • 'A' + 1 jest wyrażenie stałe. Wyrażenie stałe jest (w zasadzie) wyrażeniem, którego wynik jest zawsze taki sam i może być określone w czasie kompilacji. W szczególności 'A' + 1 jest wyrażeniem stałym, ponieważ operandami {[9] } są oba literały.

Konwersja zawężająca jest dozwolona podczas przyporządkowania byte, short oraz char, jeśli prawa strona przypisania jest wyrażeniem stałym :

Dodatkowo, jeśli wyrażenie [po prawej stronie] jest wyrażeniem stałym typu byte, short, char, lub int:

  • zwężenie można zastosować konwersję prymitywną, jeśli zmienna jest typu byte, short, or char, a wartość wyrażenia stałej jest reprezentowalna w typie zmiennej.

c + 1 jest a nie wyrażeniem stałym, ponieważ c jest zmienną Nie-final, więc dla przypisania występuje błąd w czasie kompilacji. Patrząc na kod, możemy określić, że wynik jest zawsze taki sam, ale kompilator nie może tego zrobić w tym case.

Jedną ciekawą rzeczą, którą możemy zrobić jest to:

final char a = 'a';
char b = a + 1;

W takim przypadku a + 1 jest wyrażeniem stałym, ponieważ a jest zmienną final, która jest inicjalizowana wyrażeniem stałym.

Zastrzeżenie "jeśli [ ... ] wartość [ ... ] jest reprezentowalna w typie zmiennej" oznacza, że następujące elementy nie będą kompilowane:

char c = 'A' + 99999;

Wartość 'A' + 99999 (która jest 100064, lub 0x186E0) jest zbyt duża, aby zmieścić się w char, ponieważ char jest niepodpisanym 16-bitem liczba całkowita .


Co do operatora postfix ++ :

Typem wyrażenia przyrostowego postfix jest typ zmiennej.

...

Przed dodaniem, binarna promocja liczbowa * jest wykonywana na wartości 1 i wartości zmiennej. jeśli to konieczne, suma jest zawężana przez zawężenie prostej konwersji i / lub poddawana konwersji do typu zmiennej przed jej przechowywany.

(* Promocja liczb binarnych zajmuje byte, short i char operandów operatorów, takich jak + i konwertuje je na int lub inny większy Typ. Java nie wykonuje arytmetyki na typach całkowych mniejszych niż int.)

Innymi słowy, twierdzenie c++; jest w większości równoważne:

c = (char)(c + 1);

(różnica polega na tym, że wynik wyrażenia c++, jeśli przypisaliśmy go do czegoś, jest wartością c przed przyrostem.)

Pozostałe przyrosty i przyrosty mają bardzo podobne specyfikacje.

Operatory przypisania złożonego, takie jak +=, automatycznie wykonują konwersję zawężającą, jak również , więc dozwolone są również wyrażenia takie jak c += 1 (lub nawet c += 3.14).

 40
Author: Radiodef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Konwersja Char do int nazywana jest konwersją rozszerzającą. Przy rozszerzaniu konwersji, wartości nie tracą informacji o ogólnej wielkości wartości liczbowej, gdzie konwersja int na znak jest nazywana konwersją zwężającą. Dzięki zawężeniu konwersji możesz utracić informacje o ogólnej wielkości wartości liczbowej, a także stracić precyzję.

Aby uzyskać więcej informacji na temat prymitywnych konwersji, zapoznaj się z tym dokumentem.

 4
Author: RMachnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 19:35:51

Jest tak dlatego, że kompilator może sprawdzić, czy {[0] } znajduje się w granicach znaku, podczas gdy nie może (ogólnie) sprawdzić, czy c + <an integer> znajduje się w granicach znaku.

 4
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 19:36:46

Its ponieważ literały dla liczby całkowitej lub mniejszej niż int as byte ,short I char to int . Zrozum w ten sposób, co następuje.

Kod:

  byte a = 10;//compile fine
  byte b= 11;//compile fine
  byte c = a+b;//compiler error[says that result of **a+b** is **int**]
To samo dzieje się dla dowolnych operacji matematycznych, takich jak 'dziel', 'mnożenie' i inne operacje arytmetyczne. tak więc rzuć wynik, aby uzyskać literał w pożądanym typie danych
byte c = (byte)(a+b);

Więc kiedy wykonasz

   c= c+1;//compiler error

Jego wynik c + 1 jest int a nie znak . więc kompilator podaje błąd czasu kompilacji dla to samo. musisz więc dostarczyć prymitywny cast, aby zmienić typ danych literalny na char. Mam nadzieję, że ten przykład zapewni trochę zrozumienia..

 0
Author: vinod bazari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 06:12:56