Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Почему пробел ставят “ ”, а не ' '?

#cpp #c


Есть ли рациональная причина использовать двойные, а не одинарные кавычки для вывода
единственного символа в С/C++? Например, почему пробел ставят " ", а не ' '?
    


Ответы

Ответ 1



затем, что когда ты пишешь код в котором пробелы руками программиста вставляются (это как правило дебаг/хардкод), то тебе в итоге придется менять одинарные кавычки на двойные, если ты захочешь вместо внутрь ' ' что-нибудь добавить, warning от gcc: multi-character character constant [-Wmultichar] std::cout << "abc " << 'h ' << "abc"; этот ворнинг мне нафиг не нужен, и выбирать между " и ' во время дебага программы мне тоже не нужно. А в продакшен-версии программ никакого дебаг/захардкоженного вывода не нужно тем более. кроме того, "." создает литерал .\0, а '.' - char '.', а если мешать-туда сюда массивы символов с \0 и без него, ты напросишься на проблемы с безопасностью и стабильностью кода.

Ответ 2



потому, что это типы разные - Ведь вот человек сказал АБСОЛЮТНО точно. ' ' - это тип char, а " " это тип char* ! И там, где по семантике нужен тип char (например - putc(' ', file);), там используются апострофы. А там, где по семантике требуется тип char* (например - fputs(" ", file);), там используются кавычки.

Ответ 3



Чтобы разобраться в вопросе, давайте сравним два определения переменных: a) char c = ' '; b) char const* s = " "; Сначала надо уяснить, что пробел - это такой же символ, как остальные. Так же надо знать что C/C++ языки строго типизированные, то есть каждый тип имеет свой размер! Теперь разберем, как будет действовать компилятор в случае (а). Сначала он смотрит в левую часть этого выражения, там дана инструкция, что нужно выделить память под один символ. Затем он смотрит в правую часть и проверяет является ли это одиночным символом. Для указания одиночного символа используется одинарная кавычка и как раз ее он и находит первой. Он говорит: окей, всё верно, тип совпадает, надо считать один символ и проверить, не другой ли тип это и ищет закрывающую одинарную кавычку. На этом моменте остановимся подробнее: а что будет если вдруг между двумя одинарными кавычками окажется больше чем один символ? Например, так: 'аб'. А это скажет компилятору, что произошла ошибка в коде. Видимо программист планировал что-то другое вместо одиночного символа. После проверки он найденный символ положит в память. Теперь рассмотрим случай (б). Сначала компилятор смотрит в левую часть этого выражения, там дана инструкция, что нужно выделить определенного размера память под набор символов идущих один за другим. Затем он смотрит в правую часть и проверяет является ли это набором символов. Для указания набора символов используется двойная кавычка и как раз ее он и находит первой. Он говорит: окей, всё верно, тип совпадает, надо считывать символы, пока они не закончатся. Признаком этого конца будет двойная кавычка. И по этому принципу компилятор определит размер необходимой памяти и разместит найденные символы в ней. Из всего этого сделаем вывод, что символ и набор символов это разные типы данных, то есть имеют разные размеры. К тому же компилятор работает с ними по разному.

Комментариев нет:

Отправить комментарий