Одинарные кавычки против двойных кавычек в C или C ++

208

Когда я должен использовать одинарные и двойные кавычки в программировании на C или C ++?

Вишванат Далви
источник

Ответы:

282

В C и C ++ одинарные кавычки обозначают один символ, а двойные - строковый литерал. 'a'представляет собой символьный литерал, а "a"строковый литерал содержит 'a'терминатор и нулевой символ (это массив из 2 символов).

В C ++ тип символьного литерала есть char, но обратите внимание, что в C тип символьного литерала равен 4 int, то sizeof 'a'есть 4 в архитектуре, где целые числа 32-битные (а CHAR_BIT равно 8), тогда sizeof(char)как 1 везде 1.

Дэвид Родригес - дрибеи
источник
47

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

6.4.4.4p10: «Значение целочисленной символьной константы, содержащей более одного символа (например,« ab »), или содержащей символ или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией. "

Это может выглядеть так, например:

const uint32_t png_ihdr = 'IHDR';

Результирующая константа (в GCC, которая реализует это) имеет значение, которое вы получаете, беря каждый символ и сдвигая его вверх, так что «I» заканчивается в старших значащих битах 32-битного значения. Очевидно, вы не должны полагаться на это, если вы пишете независимый от платформы код.

размотать
источник
7
Спасибо, я только видел это в некотором коде, и мой ответ может быть описан только как "WTF". Я использую GCC в течение 15 лет и никогда не сталкивался с этим до сих пор.
Eeeeaaii
+1 помимо магических заголовков, часто используется для оценки командной строки.
Вольф
28

Одинарные кавычки - это символы ( char), двойные кавычки - строки с нулем в конце ( char *).

char c = 'x';
char *s = "Hello World";
Эйко
источник
8
«привет мир» является const char *.
OldSchool
@Eiko, когда вы ставите * перед переменной, например, * s, как указано выше?
CodeGuru
@CodeGuru Вы используете *, когда переменная имеет тип указателя. В этом случае 's' указывает на массив символов.
Эйко
16
  • 'x' является целым числом, представляющим числовое значение буквы x в наборе символов машины
  • "x"массив символов длиной два символа, состоящий из ‘x’следующих‘\0’
Martynas
источник
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» - это многосимвольная константа, а не строка.

ура

Sanket
источник
8
  1. single quoteдля character;
  2. double quoteдля string.
bygreencn
источник
6

Двойные кавычки предназначены для строковых литералов, например:

char str[] = "Hello world";

Одинарные кавычки предназначены для односимвольных литералов, например:

char c = 'x';

РЕДАКТИРОВАТЬ Как сказал Дэвид в другом ответе, тип литерала символа int.

Оливер Чарльзуорт
источник
Спасибо . означает, что символ равен 1 байту без нулевого символа '/ 0' в конце .. строка содержит нулевой символ в конце.
Вишванат Дальви
2
@mr_eclair: строковый литерал всегда содержит неявный нулевой терминатор, но будьте осторожны. Вы могли бы написать что - то вроде char str[] = {'H','e','l','l','o'};, и strбыло бы не иметь нулевой терминатор.
Оливер Чарльзуорт
в этой ситуации strне строка (по крайней мере, не строка в стиле C, которая определена как NTBS).
Стив Джессоп
@ Стив: Понял. Моя точка зрения на @mr_eclair заключалась в том, что не все, что есть char[](что люди часто называют «строками»), заканчивается нулем.
Оливер Чарльзуорт
1
@OliCharlesworth это - к счастью - не полная истина: эти два строковых литералов , разделенный комментарий: "hello" /*seamlessly connected to*/ "world". И это может иметь смысл для закомментированных многострочных сообщений.
Вольф
6

В C одинарные кавычки, такие как «a», указывают символьные константы, тогда как «a» - это массив символов, всегда заканчивающийся символом 0

Йенс Гастедт
источник
4

Одинарная кавычка используется для символа, а двойная кавычка используется для строки.

Например..

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

Вывод

Hello World

Если вы использовали их в обратном случае и использовали одинарную кавычку для строки и двойную кавычку для символа. Здесь это будет результат;

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

вывод :

для первой строки. У вас будет значение мусора или неожиданное. Или у вас может быть вывод как это ..

пока для второго утверждения. Вы ничего не увидите. Еще одна вещь. Если у вас есть больше заявлений после этого. Они также не дадут вам никакого результата.

Примечание: язык PHP позволяет легко использовать одинарные и двойные кавычки.

Хафиз Шехбаз Али
источник
3

Одинарные кавычки обозначают символ, двойные обозначают строку.

В Java это также то же самое.

adiggo
источник
2
Это на самом деле не добавляет никакой ценности к вопросу, поскольку эта информация уже включена в другие ответы.
Майк Прекуп
2

Используйте одинарную кавычку с одинарным символом как:

char ch = 'a';

здесь 'a'символьная константа и равнаASCII значению char a.

Используйте двойные кавычки со строками как:

char str[] = "foo";

Вот "foo" строковый литерал.

Его можно использовать, "a"но его нельзя использоватьfoo'

codaddict
источник