Literał znaków
Literał znakowy to znak w pojedynczych cudzysłowach. Więc,
znak ident1 = 'A'; znak ident2 = 'b'; identyfikator znaku3 = '4'; identyfikator znaku4 = '6';są różne definicje postaci. Zwróć uwagę, że cyfra w pojedynczych cudzysłowach to znak, a nie liczba całkowita.
Sekwencja ucieczki, taka jak \” (patrz poniżej) w pojedynczych cudzysłowach, to znak. Więc,
znak ident1 = ''"';jest postacią.
Pojedynczy symbol w cudzysłowie nie jest znakiem; jest to ciąg jednego znaku. Tak więc „A” lub „c” lub „2” nie jest znakiem, ale ciągiem jednego znaku każdy.
Zmienna znaku może zostać ponownie przypisana później w programie w następujący sposób:
identyfikator znaku = 'x';identyfikator = 'Y';
Aby zapobiec zmianie znaku przypisanego do identyfikatora w dalszej części programu, poprzedź definicję słowem zastrzeżonym const w następujący sposób:
const char ident = 'd';Mówi się, że zmienna ident jest tylko do odczytu.
Literał ciągu
Literał ciągu to sekwencja znaków w cudzysłowach. Więc,
char ident1[] = "Kocham cię"; char ident2[] = "Nienawidzę 3 z was"; identyfikator znaku3[]= "jesteśmy światem"; char ident4[] = "Witaj świecie!";
są różne definicje literałów łańcuchowych. Zwróć uwagę na użycie podwójnych cudzysłowów. Nie ma nic lepszego niż zwykła zmienna dla łańcucha. Literał łańcuchowy to tablica znaków, w której zamiast rozdzielania za pomocą sekwencja jest rozdzielana za pomocą „”. Znaki nie są oddzielone przecinkami. W nawiasach kwadratowych można umieścić dowolną liczbę większą niż liczba znaków w literale łańcuchowym. Jednak lepiej zostawić puste nawiasy kwadratowe.
Pojedynczy znak w cudzysłowie nie jest znakiem; jest to ciąg jednego znaku. Tak więc „A” lub „c” lub „2” nie jest znakiem, ale ciągiem jednego znaku każdy.
Zmienna łańcuchowa nie pozwala na ponowne przypisanie pełnego literału, później w programie - patrz niżej. Poszczególne postacie można jednak przypisać ponownie - patrz poniżej.
Cytat pojedynczy i podwójny w znaku lub dosłownie
Aby mieć pojedynczy cytat jako znak, zrób coś takiego:,
identyfikator znaku = '\';Aby mieć podwójny cudzysłów jako znak w literale ciągu, zrób coś takiego:,
identyfikator znaku[] = "ab"cd";Ukośnik odwrotny jest używany w sekwencji specjalnej, aby uniknąć konfliktu z ogranicznikami. Aby mieć podwójny cudzysłów jako znak, nie ma potrzeby stosowania odwrotnego ukośnika: „”” jest w porządku. Aby mieć pojedynczy cudzysłów w literale ciągu, nie ma potrzeby stosowania odwrotnego ukośnika: ”ab'cd” jest w porządku.
Ponieważ odwrotny ukośnik jest używany do zmiany znaczenia znaku, musi zostać zmieniony z innym odwrotnym ukośnikiem, gdy jest używany jako znak lub w literale ciągu.
Sekwencja ewakuacyjna
Sekwencja ucieczki to jedna z:
\' " \? \\ \a \b \f \n \r >\t \vKażda sekwencja ucieczki jest zwykle wpisywana jako znak w pojedynczych cudzysłowach lub jako sekwencja ucieczki w podwójnych cudzysłowach.
- \' : jest używany jako znak pojedynczego cudzysłowu, wewnątrz pojedynczych cudzysłowów.
- \” : jest używany jako znak podwójnego cudzysłowu, w dosłownym.
- \? : od ? jest postacią zastrzeżoną, należy pominąć ją w dosłownym.
- \\ : ukośnik odwrotny powinien zostać zmieniony jako znak lub literał łańcuchowy, aby nie dawać innego znaczenia.
- \a : raz uruchamia dzwonek alarmowy, gdy jest używany jako znak lub w literale ciągu.
- \b : wyniki jako backspace na wyświetlaczu w literale ciągu, usuwając poprzedni znak.
- \f : powoduje, że następna strona jest podawana do drukarki, gdy jest używana jako znak lub w dosłownym.
- \r : zwraca kursor, w którym ma zostać wydrukowany następny znak, ale w bieżącym wierszu.
- \n : zwraca kursor na początek następnej linii lub tylko do następnej linii, w zależności od systemu operacyjnego.
- \t : tworzy poziomą zakładkę.
- \v : tworzy pionową zakładkę.
Operacje ze znakami
Powiązanie
W definicji dwa literały łańcuchowe można połączyć ze spacją w następujący sposób:
identyfikator znaku[] = "abc" "def";Cout << ident << "\n";
Dane wyjściowe to: abcdef . Tę definicję można rozszerzyć do więcej niż dwóch literałów. Uwaga: stwierdzenie jest definicją, a nie tylko zadaniem. Definicja może nawet przejść do następnego wiersza z odstępem oddzielającym wiersze w następujący sposób:
identyfikator znaku[] = "abc" "def"„ghi”;
Cout << ident << "\n";
Wynikiem jest abcdefghi.
Uwaga: Znaki nie mogą być łączone w ten sposób, ponieważ pojedyncze cudzysłowy dla znaku nie mogą mieć więcej niż jednego symbolu.
Operatory równości
Te same znaki w tej samej sprawie są równe. Nie są równe, jeśli nie są z tego samego przypadku. Rozważać,
wynik logiczny = 'B' == 'B';Cout << result << "\n";
== oznacza równe, natomiast = oznacza przypisane, a nie równe. Wyjście to 1 dla prawdy. Rozważać,
wynik logiczny = 'B' == 'b';Cout << result << "\n";
Wyjście to 0 dla fałszu. Rozważać,
wynik logiczny = 'b' == 'c';Cout << result << "\n";
Wyjście to 0 dla fałszu. Rozważać,
wynik logiczny = 'B' != „B”;Cout << result << "\n";
!= oznacza nierówne, a = oznacza przypisane i nierówne. Wyjście to 0 dla fałszu. Rozważać,
wynik logiczny = 'B' != 'b';Cout << result << "\n";
Wyjście to 1 dla prawdy. Rozważać,
wynik logiczny = 'b' != „c”;Cout << result << "\n";
Wyjście to 1 dla prawdy.
Więc == i != są operatorami równości.
Operatorzy relacyjni
W przypadku zwykłych znaków w C++, w porządku rosnącym, cyfry poprzedzają wielkie litery, które pojawiają się przed małymi literami.
Więc < will return true (1) when the left character is less than the right character. The other relational operators, <=, >, >= są podobnie wyjaśnione.
Literał tekstowy jako obiekt
Tablica jest stałym wskaźnikiem do początku sekwencji określonego typu danych. Podobnie łańcuch jest stałym wskaźnikiem do początku ciągu znaków. Porównaj następujące definicje:
int arr[] = 3, 4, 5, 6, 7;char str[] = 'w', 'o', 'm', 'a', 'n';
char stri[] = "kobieta";
Pierwsza tablica jest tablicą int i ma pięć elementów. Druga i trzecia tablica to tablice znaków o różnych nazwach, ale tej samej liczbie elementów. Druga i trzecia tablica są takie same, ale ich nazwy. Treść tekstowa drugiej tablicy jest oddzielona nawiasami klamrowymi; znaki są oddzielone przecinkami, a każdy znak jest w pojedynczych cudzysłowach. Treść tekstowa trzeciej tablicy jest ograniczona podwójnymi cudzysłowami; znaki nie są oddzielone przecinkami, a każdy znak nie jest w pojedynczych cudzysłowach. Druga i trzecia tablica to dwa sposoby tworzenia łańcucha, przy czym trzeci sposób jest lepszym sposobem.
arr jest stałym wskaźnikiem do pierwszego elementu swojej tablicy, co oznacza, że arr zawsze będzie wskazywać lokalizację z liczbą całkowitą 3, nawet jeśli wartość 3 zostanie zmieniona. Rozmiar tablicy, pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości tablicy można zmienić.
str jest stałym wskaźnikiem do pierwszego elementu swojej tablicy, co oznacza, że str zawsze będzie wskazywać lokalizację ze znakiem „w”, nawet jeśli wartość „w” zostanie zmieniona. Rozmiar tablicy znaków, pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości literału można zmienić.
stri jest stałym wskaźnikiem do pierwszego elementu jego literału (tablicy), co oznacza, że stri zawsze będzie wskazywać lokalizację ze znakiem w, nawet jeśli wartość w zostanie zmieniona. Rozmiar literału napisu (tablicy), pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości literału można modyfikować.
Co jest stałą w literale tablicowym lub łańcuchowym?? Adres pamięci pierwszego elementu tablicy lub literału pozostaje jako wartość nazwy (identyfikatora) tablicy lub literału i nie można go zmienić. Cóż, rozmiar tablicy lub literału tak naprawdę nie pozostaje stały. Każdą wartość w tablicy lub literale można zmienić. Poniższy kod pokazuje, jak zmieniono czwarty element każdej z tablic:
int arr[] = 3, 4, 5, 6, 7;char str[] = 'w', 'o', 'm', 'a', 'n';
char stri[] = "kobieta";
przyp[3] = 9;
str[3] = 'e';
stri[3] = 'e';
Cout << arr[3] << '\n';
Cout << str << '\n';
Cout << stri << '\n';
Dane wyjściowe to:
9kobiety kobiety
kobiety
Zauważ, że do elementów zdefiniowanego literału napisowego, jak w przypadku trzeciej definicji powyżej, można uzyskać dostęp za pomocą indeksu tablicy (indeks dolny). Powód drugiej linii wyjścia podano poniżej.
Definicja Indeks dolny
Zauważ, że w powyższych definicjach nie ma liczby całkowitej dla indeksu dolnego. Gdy programista nie może łatwo określić liczby elementów, należy pominąć liczbę całkowitą dla indeksu dolnego. W każdym razie liczba całkowita nie powinna być mniejsza niż liczba elementów w tablicy.
W przypadku literału napisowego liczba całkowita powinna być co najmniej o 1 wyższa od liczby znaków w łańcuchu. Dzieje się tak, ponieważ znak null (\0) jest zawsze dodawany przez kompilator na końcu tablicy, która jest ciągiem znaków rozdzielonych podwójnymi cudzysłowami. Znak null nie jest dodawany na końcu drugiej tablicy powyżej, ponieważ nie jest to oficjalny ciąg. Trzecia tablica to oficjalny ciąg. Poniższy kod pokazuje minimalne wartości indeksu dolnego.
int arr[5] = 3, 4, 5, 6, 7;char str[5] = 'w', 'o', 'm', 'a', 'n';
char stri[6] = "kobieta";
Aby druga definicja była oficjalnym ciągiem, należy dodać znak null w następujący sposób:
int arr[5] = 3, 4, 5, 6, 7;char str[6] = 'w', 'o', 'm', 'a', 'n', '\0';
char stri[6] = "kobieta";
Dane wyjściowe powinny teraz być,
9kobiety
kobiety
bez drugiej „kobiety”. Zauważ, że odpowiedni indeks dla drugiej tablicy to 6, a nie 5, jak było.
Stałe wartości literalne
Aby uniemożliwić modyfikację dowolnego znaku w cudzysłowie przypisanym do identyfikatora w dalszej części programu, poprzedź definicję słowem zastrzeżonym const w następujący sposób:
const char ident[] = "Kocham cię";Operacje z literałami ciągów
Operacje na rzecz równości
Operatorami równości są == i != . Kiedy porównywane są zmienne (identyfikatory) dwóch ciągów, porównywane są wskaźniki (adresy) literałów; to jest złe. Aby porównać ciągi, należy porównać literały, jak w poniższym kodzie:
wynik logiczny = "kobieta" == "kobieta";Cout << result << '\n';
Wyjście to 1 dla prawdy. Porównanie odbywa się w sposób słownikowy, ale liczby pojawiają się na początku w kolejności rosnącej, przed wielkimi literami, które pojawiają się przed małymi literami. Wyjście poniższego kodu to 0, dla false.
wynik logiczny = "kobieta" != "kobieta";Cout << result << '\n';
Operatory relacyjne z literałami łańcuchowymi
Operatory relacyjne nie działają z literałami łańcuchowymi.
Literał surowego ciągu
Literał surowego łańcucha umożliwia wyświetlanie łańcucha jako wpisanego, ignorując sekwencje specjalne i respektując znaki nowej linii. Rozważ następujący kod:
char str[] = R"(abc\\d efg hijklmn \n " ' opq
pierwszy)";
Cout << str << '\n';
Dane wyjściowe to:
abc\\d efg hijklmn \n " ' opq
pierwszy
W kodzie literał surowego ciągu rozpoczyna się od R, po którym następuje ” i ( . Kończy się na ) i „.
Typy literałów ciągu głównego C++
zwęglać
Typ char jest oryginalnym typem C++ i zazwyczaj przechowuje znak w 8 bitach.
char16_t
To przechowuje znak w 16 bitach.
char32_t
To przechowuje znak w 32 bitach.
wchar_t
char16_t i char32_t to szerokie znaki. wchar_t to szeroki znak, który jest zastrzeżony i zdefiniowany w implementacji.
Wniosek
Literał znakowy to pojedynczy znak w pojedynczych cudzysłowach. Sekwencja ucieczki to znak, który może być również w pojedynczych cudzysłowach. Literał ciągu to ciąg znaków w cudzysłowach. Literał ciągu to tablica znaków kończąca się na \0. Operatory równości i relacji działają z literałami znakowymi. Operatory równości działają z literałami łańcuchowymi, ale operatory relacyjne nie działają z literałami łańcuchowymi. W porównaniach można używać identyfikatorów znakowych, ale w porównaniach nie należy używać identyfikatorów znakowych. Literał surowego ciągu umożliwia wyświetlanie ciągu jako wpisanego, ignorując sekwencje specjalne i szanując nowe wiersze.
Chrys