Одиночні цитати проти подвійних лапок у С або С ++


Відповіді:


282

У C і C ++ одиничні лапки ідентифікують один символ, тоді як подвійні лапки створюють рядковий буквал. 'a'є одинарним літеральним символом, в той час "a"як літеральним рядком, що містить 'a'і нульовий термінатор (це масив з 2 знаків).

У C ++ тип буквеного символу є char, але зауважте, що в C тип літерального символу є int, тобто sizeof 'a'4 в архітектурі, де ints є 32-бітовими (а CHAR_BIT - 8), тоді sizeof(char)як 1 скрізь.


47

Деякі компілятори також реалізують розширення, яке дозволяє константи з кількома символами. Стандарт C99 говорить:

6.4.4.4p10: "Значення цілої константи символів, що містить більше одного символу (наприклад, 'ab') або містить символьну або послідовну послідовність символів, яка не відображається на однобайтовий символ виконання, визначається реалізацією. "

Це може виглядати приблизно так:

const uint32_t png_ihdr = 'IHDR';

Отримана константа (у GCC, яка реалізує це) має значення, яке ви отримуєте, беручи кожен символ і зміщуючи його вгору, так що "Я" виявляється в найбільш значущих бітах 32-бітного значення. Очевидно, ви не повинні покладатися на це, якщо ви пишете незалежний код платформи.


7
Дякую, я щойно побачив це в якомусь коді, і моя відповідь може бути описана лише як "WTF". Я використовую GCC і вимикаю протягом 15 років, і ніколи не стикався з цим до цих пір.
eeeeaaii

Окрім магічних заголовків, які часто використовуються для оцінки командного рядка.
Вовк

28

Одиничні лапки - це символи ( char), подвійні лапки - це рядки з нульовим завершенням ( char *).

char c = 'x';
char *s = "Hello World";

8
"привіт світ" - це const char *.
OldSchool

@Eiko, коли ти ставиш * infront змінної, наприклад * s, як вище?
CodeGuru

@CodeGuru Ви використовуєте *, коли змінна - тип вказівника. У цьому випадку 's' вказує на масив символів.
Ейко

16
  • 'x' являє собою ціле число, що представляє числове значення літери х у наборі символів машини
  • "x"являє собою масив символів, довжиною в два символи, що складається з ‘x’наступних‘\0’

2
Досить пізно;) що насправді нового у вашій відповіді - порівняйте ті, що вже були надані?
Вовк

10

Одиночні лапки призначені для одного символу. Подвійні лапки призначені для рядка (масив символів). Ви можете використовувати окремі лапки, щоб створити рядок по одному символу за раз, якщо вам подобається.

char myChar     = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };

10

Я роздумував такі речі, як: int cc = 'cc'; Буває, що це в основному байтова копія до цілого числа. Отже, спосіб дивитися на це полягає в тому, що 'cc', який в основному становить 2 c, копіюється на нижчі 2 байти цілого cc. Якщо ви шукаєте дрібниці, то

printf("%d %d", 'c', 'cc'); would give:

99 25443

це тому, що 25443 = 99 + 256 * 99

Отже, "cc" - це константа багато символів, а не рядок.

Ура



6

Подвійні лапки призначені для рядкових літералів, наприклад:

char str[] = "Hello world";

Одиночні лапки призначені для однозначних літералів, наприклад:

char c = 'x';

EDIT Як Девід заявив в іншій відповіді, тип буквеного символу є int.


Дякую . означає, що символ - 1 байт без нульового символу '/ 0' в кінці .. рядок містить нульовий символ в кінці.
Vishwanath Dalvi

2
@mr_eclair: Літеральний рядок завжди містить неявний нульовий термінатор, але будьте уважні. Ви могли б написати що - щось на зразок char str[] = {'H','e','l','l','o'};, і strбуло б НЕ мати нульовий термінатор.
Олівер Чарльворт

у цій ситуації strне є рядком (принаймні, не рядком у стилі C, який визначено як NTBS).
Стів Джессоп

@Steve: зрозумів. Моя думка до @mr_eclair полягала в тому, що не все, що є char[](що люди часто називають "струнними"), не припиняється.
Олівер Чарльворт

1
@OliCharlesworth це - до щастя - не повна істина: ці два строкових літералів , розділений коментар: "hello" /*seamlessly connected to*/ "world". І це може мати сенс для коментованих багаторядкових повідомлень.
Вовк

6

В одиночних лапках типу "a" вказують константи символів, тоді як "a" - це масив символів, завжди закінчується символом 0


4

Одинична цитата використовується для символу, а подвійна - для рядка.

Наприклад..

 printf("%c \n",'a');
 printf("%s","Hello World");

Вихідні дані

Привіт Світ

Якщо ви використовували їх, навпаки, і використовували одну цитату для рядка та подвійну цитату для символу. Ось, це буде результат;

  printf("%c \n","a");
  printf("%s",'Hello World');

вихід:

для першого рядка. У вас буде значення сміття або несподіване. Або у вас може бути такий вихід.

тоді як для другого твердження. Ви нічого не побачите. Ще одне. Якщо після цього у вас є більше тверджень. Вони також не дадуть результату.

Примітка. Мова PHP надає вам можливість легко використовувати одну та подвійну цитату.


3

Одиничні лапки позначають знак, а подвійне позначають рядок.

У Java це теж саме.


2
Це насправді не додає ніякого значення питанню, оскільки ця інформація вже була включена в інші відповіді.
Майк Precup

2

Використовуйте єдину цитату з одним знаком як:

char ch = 'a';

тут 'a'є константа char і дорівнює ASCIIзначенню char a.

Використовуйте подвійну цитату з рядками як:

char str[] = "foo";

ось "foo"рядковий літерал.

Це добре використовувати, "a"але використовувати його не нормально "foo'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.