C Language
Literały dla liczb, znaków i ciągów znaków
Szukaj…
Uwagi
Termin literał jest powszechnie używany do opisania sekwencji znaków w kodzie C, która oznacza stałą wartość, taką jak liczba (np. 0
) lub ciąg znaków (np. "C"
). Ściśle mówiąc, standard używa terminu stała dla stałych liczb całkowitych, zmiennych zmiennoprzecinkowych, stałych wyliczania i stałych znakowych, rezerwując termin „literał” dla literałów łańcuchowych, ale nie jest to powszechne użycie.
Literały mogą mieć prefiksy lub sufiksy (ale nie oba), które są dodatkowymi znakami, które mogą rozpoczynać lub kończyć literał w celu zmiany jego domyślnego typu lub reprezentacji.
Literały całkowite
Literały całkowite służą do zapewnienia wartości całkowitych. Obsługiwane są trzy bazy liczbowe, oznaczone prefiksami:
Baza | Prefiks | Przykład |
---|---|---|
Dziesiętny | Żaden | 5 |
Octal | 0 | 0345 |
Szesnastkowy | 0x lub 0X | 0x12AB , 0X12AB , 0x12ab , 0x12Ab |
Zauważ, że ten tekst nie zawiera żadnego znaku, więc literały całkowite są zawsze dodatnie. Coś w rodzaju -1
jest traktowane jako wyrażenie, które ma jedną literał całkowitą ( 1
), która jest negowana przez -
Typ literału dziesiętnego liczby całkowitej jest pierwszym typem danych, który może pasować do wartości od int
i long
. Od C99 long long
jest obsługiwany również w przypadku bardzo dużych literałów.
Typ ósemkowej lub szesnastkowej liczby całkowitej jest pierwszym typem danych, który może pasować do wartości od int
, unsigned
, long
i unsigned long
. Od C99 long long
i unsigned long long
są obsługiwane także dla bardzo dużych literałów.
Używając różnych sufiksów, można zmienić domyślny typ literału.
Przyrostek | Wyjaśnienie |
---|---|
L , l | long int |
LL , ll (od C99) | long long int |
U , u | unsigned |
Przyrostki U i L / LL można łączyć w dowolnej kolejności i każdym przypadku. Duplikowanie sufiksów (np. Podawanie dwóch sufiksów U
) jest błędem, nawet jeśli mają różne przypadki.
Literały łańcuchowe
Literały łańcuchowe służą do określania tablic znaków. Są to ciągi znaków zawarte w podwójnych cudzysłowach (np. "abcd"
i mają typ char*
).
Przedrostek L
powoduje, że literał jest szeroką tablicą znaków, typu wchar_t*
. Na przykład L"abcd"
.
Od C11 istnieją inne prefiksy kodowania, podobne do L
:
prefiks | typ podstawowy | kodowanie |
---|---|---|
Żaden | char | zależny od platformy |
L | wchar_t | zależny od platformy |
u8 | char | UTF-8 |
u | char16_t | zwykle UTF-16 |
U | char32_t | zwykle UTF-32 |
W przypadku dwóch ostatnich można zapytać za pomocą makr testu funkcji, jeśli kodowanie jest faktycznie odpowiednim kodowaniem UTF.
Literały zmiennoprzecinkowe
Literały zmiennoprzecinkowe służą do reprezentowania liczb rzeczywistych ze znakiem. Do określenia rodzaju literału można użyć następujących sufiksów:
Przyrostek | Rodzaj | Przykłady |
---|---|---|
Żaden | double | 3.1415926 -3E6 |
f , F | float | 3.1415926f 2.1E-6F |
l , L | long double | 3.1415926L 1E126L |
Aby użyć tych sufiksów, literał musi być literałem zmiennoprzecinkowym. Na przykład 3f
jest błędem, ponieważ 3
jest literałem całkowitym, a 3.f
lub 3.0f
są poprawne. W przypadku long double
zalecenia zaleca się zawsze używać long double
L
ze względu na czytelność.
Literały postaci
Literały znakowe to specjalny rodzaj literałów całkowitych, które są używane do reprezentowania jednego znaku. Są one ujęte w pojedyncze cudzysłowy, np. 'a'
i mają typ int
. Wartość literału jest liczbą całkowitą zgodnie z zestawem znaków maszyny. Nie pozwalają na przyrostki.
Przedrostek L
przed literałem znaku powoduje, że jest to szeroki znak typu wchar_t
. Podobnie, ponieważ prefiksy C11 u
i U
sprawiają, że są to szerokie znaki odpowiednio typu char16_t
i char32_t
.
W przypadku zamiaru przedstawienia pewnych znaków specjalnych, takich jak znak, który nie jest drukowany, stosowane są sekwencje specjalne. Sekwencje specjalne używają sekwencji znaków, które są tłumaczone na inną postać. Wszystkie sekwencje specjalne składają się z dwóch lub więcej znaków, z których pierwszy to odwrotny ukośnik \
. Znaki występujące bezpośrednio po odwrotnym ukośniku określają, jak literał znak jest interpretowany w sekwencji.
Sekwencja ewakuacyjna | Reprezentowana postać |
---|---|
\b | Backspace |
\f | Form feed |
\n | Przesuw linii (nowa linia) |
\r | Zwrot karetki |
\t | Zakładka pozioma |
\v | Zakładka pionowa |
\\ | Ukośnik wsteczny |
\' | Pojedynczy cudzysłów |
\" | Podwójny cudzysłów |
\? | Znak zapytania |
\nnn | Wartość ósemkowa |
\xnn ... | Wartość szesnastkowa |
Sekwencja ewakuacyjna | Reprezentowana postać |
---|---|
\a | Alarm (dźwięk, dzwonek) |
Sekwencja ewakuacyjna | Reprezentowana postać |
---|---|
\unnnn | Uniwersalna nazwa postaci |
\Unnnnnnnn | Uniwersalna nazwa postaci |
Uniwersalna nazwa znaku to punkt kodowy Unicode. Uniwersalna nazwa postaci może być przypisana do więcej niż jednego znaku. Cyfry n
są interpretowane jako cyfry szesnastkowe. W zależności od używanego kodowania UTF uniwersalna sekwencja nazw znaków może dać punkt kodowy składający się z wielu znaków zamiast jednego normalnego char
.
Podczas korzystania z sekwencji ucieczki przejścia do wiersza w trybie tekstowym we / wy jest on konwertowany na bajt lub wiersz bajtów specyficzny dla systemu operacyjnego.
Sekwencja zmiany znaczenia znaku zapytania służy do unikania oznaczeń trigraficznych . Na przykład ??/
jest kompilowany jako trygraf reprezentujący znak odwrotnego ukośnika '\'
, ale użycie ?\?/
Dałoby ciąg "??/"
.
Może być jeden, dwa lub trzy cyfry ósemkowe n
w kolejności wartości ósemkowe.