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++;
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
nachar
nazywa się zawężanie nawrócenia prymitywnego, ponieważchar
jest typem mniejszym odint
. -
'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.
Dodatkowo, jeśli wyrażenie [po prawej stronie] jest wyrażeniem stałym typu
byte
,short
,char
, lubint
:
- zwężenie można zastosować konwersję prymitywną, jeśli zmienna jest typu
byte
,short
, orchar
, 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 .
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
).
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.
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.
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..
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