Как завершаются строки с нулевым символом в 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' и т.п.

Другие вопросы по тегам