Хорошо, я понял это. Я пошел в File >> New >> Project, выбрал «ASP.Net Core Web Application», затем в следующем окне мне пришлось изменить «ASP.NET Core 2.2» на «ASP.NET Core 2.1», тогда шаблоны были .
Я использую '\0'
для nul-символа и NULL
для указателей, потому что это является самым ясным в обоих случаях.
BTW, оба 0
и '\0'
int
s в C и любом будет преобразован в char
при хранении в a char
переменная.
const char END_OF_STRING = '\0';
Таким образом, когда Вы говорите:
str[i] = END_OF_STRING;
или
if (*ptr == END_OF_STRING)
нет абсолютно никакого вопроса, что Вы имеете в виду.
Мы используем ПУСТОЙ УКАЗАТЕЛЬ для указателей и NULLCHAR для символов, с помощью
#define NULLCHAR '\0'
Системы, которые не используют двоичный 0 для ПУСТОГО УКАЗАТЕЛЯ, становятся более твердыми найти. Они также имеют тенденцию иметь различные проблемы мобильности. Почему? Поскольку в этих системах ни memset, ни calloc не могут убрать структуру, которая содержит указатели правильно.
Для коммуникации я использую ПУСТОЙ УКАЗАТЕЛЬ. Если я работаю с разработчиком, который не может схватить понятие ПУСТОГО УКАЗАТЕЛЯ для различных типов данных затем, я был бы заинтересован.
Для реализации это является определенным для случая. Числа 0 (снабдил постфиксом f для с плавающей точкой), указатели являются Пустыми, и символьные строки 0.
Мне вполне нравится
#define ASCII_NUL ('\0')
Я только достаточно редко ввожу с опечаткой '\0' как '0'. Но когда я сделал это, я нашел, что ошибка очень трудно определяет инспекцией кода с веселыми последствиями. Таким образом, я не люблю '\0' очень и предпочитаю ASCII_NUL или 0 (конечно, у последнего есть неправильный тип в C++). Очевидно, я использую '\0', где потребовано непротиворечивостью с существующим кодом или руководствами по стилю.
Google руководство по стилю C++, которое содержит несколько вещей, которые я люблю и некоторые, я не делаю, но кажется главным образом звуковым, предпочитает ПУСТОЙ УКАЗАТЕЛЬ 0 для указателей. Это указывает, что ПУСТОЙ УКАЗАТЕЛЬ не мог бы быть определен просто как 0 (или 0L), особенно в реализациях, где sizeof (пусто*) не мог бы быть sizeof (интервал) (или sizeof (длинное целое)).
0 и ПУСТОЙ УКАЗАТЕЛЬ и указаны, чтобы иметь целочисленный тип, и при преобразовании в тип указателя они оба должны привести к значению нулевого указателя. Но они обязательно не имеют того же целочисленного типа. Таким образом, Вы могли бы очевидно получить некоторые полезные предупреждения или ошибки в некоторых ситуациях при помощи ПУСТОГО УКАЗАТЕЛЯ.
В то время как в целом я был бы совет с помощью названный константами, это - одно исключение. Мне, определяя:
#define NULL 0
#define END_OF_STRING '\0'
имеет столько же смысла сколько определение:
#define SEVEN 7
который не является ни одним. И да, я знаю, что ПУСТОЙ УКАЗАТЕЛЬ уже определяется компилятором, но я никогда не использую его. Для указателей, 0; для символов, '\0'. Дольше не всегда означает более выразительный.
A one-L NUL, it ends a string.
A two-L NULL points to no thing.
And I will bet a golden bull
That there is no three-L NULLL.
(The name of the original author is, alas, lost to the sands of time.)
Существует много английских слов по буквам, которые произносят или говорят одинаково, все же которые имеют различные значения. Как на английском языке, используйте контекст, в котором обсуждение происходит для руководства Вас к подразумеваемому смыслу.
@BKB:
Я вижу точку в его совете, но "ПУСТОЙ УКАЗАТЕЛЬ" делает это более ясным, что контекст является указателями. Это похоже на использование "0.0" для значений с плавающей точкой, как '\0' при контакте с символами. (Аналогично, я предпочитаю видеть 0, если символ используется в арифметическом контексте.)
У Bjarne дальнейшие состояния в этом FAQ, что ПУСТОЙ УКАЗАТЕЛЬ является #defined как 0 так или иначе, столь стандартный код, не должно быть проблемы с ним. Я соглашаюсь, что нотация всех заглавных букв ужасна, но мы должны будем ожидать до 0x (где nullptr будет доступен как ключевое слово.)
END_OF_STRING глуп, так как это - дополнительная косвенность, которая просто смущает новых читателей (любой, кто сразу не распознает '\0', должен ступить далеко от клавиатуры).
Еще одна вещь — я думаю, что различие между нулевым значением и пустым значением чрезвычайно важно при разговоре о моделировании данных. Это особенно верно при обсуждении строк C-стиля или nullable полей базы данных. Существует огромная разница между кем-то говорящим Вам, "У меня нет имени" и "Меня зовут".
Если я помню правильно, что большинство компиляторов C определяет ПУСТОЙ УКАЗАТЕЛЬ как это:
#define NULL ((void*)0)
Это должно гарантировать, что ПУСТОЙ УКАЗАТЕЛЬ интерпретируется как являющийся типом указателя (в C). Однако это может вызвать проблемы в намного большем количестве типа строгий мир C++. Например:
// Example taken from wikibooks.org
std::string * str = NULL; // Can't automatically cast void * to std::string *
void (C::*pmf) () = &C::func;
if (pmf == NULL) {} // Can't automatically cast from void * to pointer to member function.
Поэтому в текущем стандарте C++ нулевые указатели должны быть инициализированы с литеральным 0. Очевидно, потому что люди так привыкли к использованию ПУСТОГО УКАЗАТЕЛЯ, определяют, я думаю много компиляторов C++ или тихо игнорирую проблему или переопределяю ПУСТОЙ УКАЗАТЕЛЬ, чтобы быть 0 в коде C++. Например:
#ifdef __cplusplus
#define NULL (0)
#else
#define NULL ((void*)0)
#endif
C++ x0 стандарт теперь определяет a nullptr
ключевое слово для представления нулевых указателей. Компилятор CLI/C++ 2005 Visual C++ также использует это ключевое слово при установке управляемых указателей в NULL. В текущих компиляторах можно создать шаблон для эмуляции этого нового ключевого слова.
Существует намного более подробная статья о wikibooks.org, обсуждающем этот вопрос.
Мне нравится предопределенный ПУСТОЙ макрос, поскольку он сохраняет семантическое значение, а не некоторое другое использование номера 0.
Вроде как: Slashdot недавно опубликовал статью о comp.lang.c
разделе часто задаваемых вопросов о нулевых указателях , которую я нашел довольно интересным.