Kiedy powinienem używać pojedynczych cudzysłowów i podwójnych cudzysłowów w programowaniu w C lub C ++?
Kiedy powinienem używać pojedynczych cudzysłowów i podwójnych cudzysłowów w programowaniu w C lub C ++?
Odpowiedzi:
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 *
).
char c = 'x';
char *s = "Hello World";
const char *
.
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.
char myChar = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };
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
printf("%d %d", 'c', 'cc'); would give:
99 25443
to dlatego, że 25443 = 99 + 256 * 99
Zatem „cc” jest stałą wieloznakową, a nie ciągiem znaków.
Twoje zdrowie
Podwójne cudzysłowy dotyczą literałów łańcuchowych, np .:
char str[] = "Hello world";
Pojedyncze cudzysłowy dotyczą literałów jednoznakowych, np .:
char c = 'x';
EDYCJA Jak David stwierdził w innej odpowiedzi, typ literału znaku to int
.
char str[] = {'H','e','l','l','o'};
, i str
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
Pojedynczy cudzysłów służy do znakowania, a podwójny do ciągów.
printf("%c \n",'a');
printf("%s","Hello World");
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;
printf("%c \n","a");
printf("%s",'Hello World');
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.
Pojedyncze cudzysłowy oznaczają znak, podwójne oznaczają ciąg.
W Javie jest tak samo.