Kiedy powinienem używać pojedynczych cudzysłowów i podwójnych cudzysłowów w programowaniu w C lub C ++?
W C i C ++ pojedyncze cudzysłowy identyfikują pojedynczy znak, podczas gdy podwójne cudzysłowy tworzą literał łańcuchowy. 'a'
jest literałem pojedynczego znaku, podczas gdy "a"
literałem łańcuchowym zawiera 'a'
terminator i zerowy terminator (czyli tablica 2 znaków ).
W C ++ typem literału znaków jest char
, ale zauważ, że w C typem literału znaków jest int
, to sizeof 'a'
znaczy 4 w architekturze, w której ints są 32-bitowe (a CHAR_BIT to 8), podczas gdy sizeof(char)
wszędzie jest 1.
Niektóre kompilatory implementują także rozszerzenie, które pozwala na stosowanie stałych wieloznakowych. Standard C99 mówi:
6.4.4.4p10: „Wartość stałej liczby całkowitej zawierającej więcej niż jeden znak (np.„ Ab ”) lub zawierającej znak lub sekwencję zmiany znaczenia, która nie jest odwzorowywana na jednobajtowy znak wykonania, jest zdefiniowana w implementacji. „
Może to wyglądać na przykład tak:
const uint32_t png_ihdr = 'IHDR';
Wynikowa stała (w GCC, która to implementuje) ma wartość, którą otrzymujesz, biorąc każdy znak i przesuwając go w górę, tak że „I” kończy się na najbardziej znaczących bitach 32-bitowej wartości. Oczywiście nie powinieneś na tym polegać, jeśli piszesz niezależny od platformy kod.
Pojedyncze cudzysłowy to znaki (
char
), podwójne cudzysłowy to ciągi zakończone znakiem null (char *
).źródło
const char *
.'x'
jest liczbą całkowitą, reprezentującą wartość liczbową litery x w zestawie znaków maszyny"x"
to tablica znaków o długości dwóch znaków, po której‘x’
następuje‘\0’
źródło
Pojedyncze cudzysłowy dotyczą jednego znaku. Podwójne cudzysłowy odnoszą się do ciągu znaków (tablica znaków). Jeśli chcesz, możesz użyć pojedynczych cudzysłowów, aby utworzyć ciąg po jednym znaku na raz.
źródło
Grzebałem w takich rzeczach jak: int cc = 'cc'; Zdarza się, że jest to w zasadzie bajtowa kopia na liczbę całkowitą. Stąd sposób, aby na to spojrzeć, polega na tym, że „cc”, czyli w zasadzie 2 c, są kopiowane do niższych 2 bajtów liczby całkowitej cc. Jeśli szukasz ciekawostek, to
99 25443
to dlatego, że 25443 = 99 + 256 * 99
Zatem „cc” jest stałą wieloznakową, a nie ciągiem znaków.
Twoje zdrowie
źródło
single quote
jest dlacharacter
;double quote
jest dlastring
.źródło
Podwójne cudzysłowy dotyczą literałów łańcuchowych, np .:
Pojedyncze cudzysłowy dotyczą literałów jednoznakowych, np .:
EDYCJA Jak David stwierdził w innej odpowiedzi, typ literału znaku to
int
.źródło
char str[] = {'H','e','l','l','o'};
, istr
by nie mieć null terminator.str
nie jest łańcuchem (a przynajmniej łańcuchem w stylu C, który jest zdefiniowany jako NTBS).char[]
(co ludzie często określają jako „ciągi”), jest zakończone zerem ."hello" /*seamlessly connected to*/ "world"
. Może to mieć sens w przypadku komentowanych wiadomości wieloliniowych.W C pojedyncze cudzysłowy, takie jak „a”, oznaczają stałe znaków, podczas gdy „a” to tablica znaków, zawsze zakończona znakiem 0
źródło
Pojedynczy cudzysłów służy do znakowania, a podwójny do ciągów.
Na przykład..
Wynik
Hello World
Jeśli użyłeś ich odwrotnie i użyłeś pojedynczego cudzysłowu dla ciągu i podwójnego cudzysłowu dla znaku. Tutaj będzie to wynik;
wynik :
dla pierwszego wiersza. Będziesz miał wartość śmieciową lub nieoczekiwaną. lub możesz mieć takie dane wyjściowe ..
podczas drugiego zdania. Nic nie zobaczysz. Jeszcze jedno. Jeśli masz więcej stwierdzeń po tym. Nie dadzą też żadnego rezultatu.
Uwaga: język PHP daje elastyczność w korzystaniu z pojedynczego i podwójnego cudzysłowu.
źródło
Pojedyncze cudzysłowy oznaczają znak, podwójne oznaczają ciąg.
W Javie jest tak samo.
źródło
Użyj pojedynczego cudzysłowu z pojedynczym znakiem jako:
tutaj
'a'
jest stała char i jest równaASCII
wartości char a.Użyj podwójnego cudzysłowu z ciągami jako:
oto
"foo"
dosłowny ciąg znaków.Można używać,
"a"
ale nie można używać „foo'
źródło