Как завершаются строки с нулевым символом в C++11?
Может быть, это глупо или очевидно, но я не смог найти ни одного ответа. Какой символ заканчивается строкой с нулевым символом в конце C++11
? NULL
(что на самом деле 0
) или новый nullptr
? С одной стороны, nullptr
должен заменить NULL
, С другой стороны, я не уверен, если nullptr
это персонаж на всех. Или может быть истолковано как единое целое.
2 ответа
NULL
а также nullptr
имеет мало общего с завершенными нулем строками. И то и другое NULL
а также nullptr
используются для обозначения указателя, который ничего не указывает, т.е. ноль
Нуль-завершение строк в стиле c все еще (и всегда) обозначается как CharT
имеющий интегральное значение 0
; или как это чаще всего пишется во время разговора через буквальный символ; '\0'
,
Помните, что типы символов - это не что иное, как целочисленные типы с особым значением
Сравнивая char
для int
(который является типом буквального 0
) разрешено, также разрешено присваивать значение 0
к char
, как указано: тип символа является целочисленным типом.. а целочисленные типы содержат целочисленные значения.
Почему эта путаница?
В те времена, когда у нас не было nullptr
вместо этого у нас был макрос NULL
для обозначения того, что определенному указателю не на что было указывать. Значение NULL
является и было специфичным для реализации, но поведение было четко определено; он не должен сравниваться с любым значением указателя, которое фактически указывает на что-то.
В результате того, как поведение NULL
было описано множество используемых компиляторов #define NULL 0
или подобная конструкция, приводящая к "особенности", где можно легко сравнить NULL
к любому целочисленному типу (включая char
), чтобы увидеть, если это отношение к нулевому значению.
С учетом ранее изложенного вы часто сталкивались с кодом, подобным приведенному ниже, где условие for было бы эквивалентно *ptr != 0
,
char const * str = "hello world";
for (char const * ptr = str; *ptr != NULL; ++ptr) {
...
}
Извлеченный урок: только то, что что-то работает, не означает, что это правильно...
NULL
а также nullptr
являются совершенно отдельными понятиями от "нулевого терминатора". У них нет ничего более общего, чем слово "ноль". Терминатор NULL - это символ со значением 0
, Это не имеет ничего общего с нулевыми указателями.
Ты можешь использовать 0
или же '\0'
и т.п.