10 ответов:
важно помнить, что
strна самом деле это не "строка", а скорее указатель в ячейку памяти, где achar(часть строки) сохраняется.Далее, мы должны понять, как компилятор видит все эти предметы. Давайте посмотрим на их типы:
strтипаchar *(буквально, "указатель наchar")NULLявляется константой нулевого указателя (по крайней мере, в моей системе, это((void*)0))''является символьной константой (это на самом деле типаint, но не беспокойтесь об этом; это обычно используется в контексте, который требуетcharзначение)посмотреть
*inchar *иvoid *? Это говорит компилятору, что это типы указателей (что является причудливым способом сказать, что переменные этого типа не содержат значения, они просто указывают на него). Поэтому, когда компилятор видитchar *str, он знает, что вы можете попросить сделать что-то вроде*strилиstr[0](что одно и то же). Мы вернемся к этому позже.видишь, когда пишешь
strв программе C компилятор знает, что переменная с именем "str" хранится в ячейке памяти, например 0x0001. Код, который он генерирует, переходит к 0x0001 и извлекает значение. Таким образом, если вы делаете что-то вродеstr + 1тогда компилятор будет генерировать код, который выглядит примерно так:
fetch the value from where str is stored (0x0001) add 1 to that valueчто я уверен, что ты это знаешь. Так что теперь должно быть очевидно, что эта строка говорит:
str == NULLС
NULLявляется константой нулевого указателя, эта строка проверяет, является лиstr- это нулевой указатель (т. е. указатель, который не указывает ни на что).поэтому компилятор обычно генерирует такой код:
fetch the value from where str is stored check if that value is 0помните теперь, пожалуйста, что мы сказали компилятору, что
strявляется типом указателя. Так что нам разрешено писать это:*strи это заставляет компилятор генерировать следующее:
fetch the value from where str is stored now use that value as a memory address and fetch what is stored thereпоэтому, если str содержит 0x0200, то мы получим значение из адреса памяти 0x0200. Обратите внимание, что компилятору все равно, действительно ли там хранится строка или нет.
(я предполагаю, что вы знаете, что
str[0]это то же самое, что*str. Это облегчает объяснение того, что происходит.)как насчет этого?
*str == ''так, что линия действительно, в сущности:
*str == (char) 0что заставляет компилятор генерировать это:
fetch the value from where str is stored now use that value like a memory address and fetch the char that is stored there check if the value of that fetched char is 0подведем итоги:
- писать
str == NULLговорит ли вам указательstrуказывает ни при чем.- писать
*str == ''говорит ли вам указательstrнаправлен в пустая строка (фактически, указывая на ячейку памяти, содержащую ноль).("строка", by определение "непрерывная последовательность символов, заканчивающаяся первым нулевым символом и включающая его", поэтому, если самый первый символ строки
'', то строка является пустой строкой.)
str==NULLуказывает, является ли указатель нулевым.
str[0]==''говорит вам, если строка имеет нулевую длину.в этом коде тест:
if ((str == NULL) || (str[0] == ''))используется для улавливания случая, когда он либо равен нулю, либо имеет нулевую длину.
обратите внимание, что короткое замыкание играет ключевую роль здесь: смысл теста в том, чтобы убедиться, что
strявляется допустимой c-строкой длиной не менее 1.
- второй тест
str[0] == ''будет работать только еслиstrне является нулем.- поэтому первый тест
str == NULLнеобходимо вырваться рано, когдаstrимеет значение null.
по сути
str == NULLопределяет, является лиstrэтоNULLуказательstr[0] == ''определяет, является лиstr- это строка стиля c длиной 0когда вы объединяете их, вы проверяете, является ли он пустым или пустым. Это позволяет функции исключить обе формы пустых данных в начале метода
str == NULLпроверка str является нулевым указателем (указатель в никуда)
str[0] == ''(если не нулевой указатель) проверка первого элемента str имеет 0-значение (строка без символов только 0-завершается)
str==NULLговорит вам, является ли строкаNULL.
*str==''говорит вам, если строка имеет нулевую длину.Примечание: этот ответ-игра на мистический 15-секундный ответ который
str==''. Конечно, изменения, внесенные в первые 3 или 4 минуты не показано и он починил ಠ_ಠ.
str == NULL означает "str указывает на нулевой адрес памяти" (или любой адрес, который равен нулю в вашей системе). Обычно это означает, что нет никакой строки.
str[0] = = '\0' означает "первый символ str-это символ нуля" (который отмечает конец строки). Это означало бы, что есть строка, но она пуста. Подумайте о пустой чашке против никакой чашки вообще; та же идея.
на других языках вы можете написать
str == nullvsstr == "". Они означают две разные вещи. Это особенно важно понимать разницу в C, так как попытка использовать нулевой указатель приведет к сбою программы.
str == NULLЭто означает, что строка не имеет ссылки на строку, потому что это указатель Null(означает, что адрес строки null).
str[0] == ''-- означает строку с длиной 0.пожалуйста, дайте мне знать, если что-то не так в этом объяснении или у вас все еще есть сомнения.
str == NULLозначает, что str не указывает на какой-либо адрес = указатель пуст.
и
str[0] == ''str указывает на допустимый адрес, и эта строка проверяет, является ли первый символ (т. е. str[0]) цифрой 0 ( значение ascii '\0'), что означает конец строки. тогда строка пуста. (в str нет символа : первый-это конечный символ)
1 ->
str == NULLопределяет, является ли str нулевым указателем 2 ->str[0] == ''))короткое замыкание оператора OR входит в изображение, поскольку оно гарантирует, что либо строка не указывает ни на что, либо на пустую строку..
C# эквивалент этого:
if (string.IsNullOrEmpty(str)) { }простой смысл заключается в том, является ли строка нулевой или пустой строкой.
Comments