В чем разница между str==NULL и str[0]=='' в C?
Я хочу знать разницу между str == NULL
и str[0] == ''
:
int convert_to_float(char *str, double *num)
{
if ((str == NULL) || (str[0] == ''))
return(-1);
*num = strtod(str, (char **)NULL);
return(0);
}
Я использую gcc в Linux.
10 ответов
важно помнить, что str
на самом деле это не "строка", а скорее указатель в место памяти, где char
(часть строки) сохраняется.
Далее, мы должны понять, как компилятор видит все эти предметы. Давайте посмотрим на их типы:
-
str
типаchar *
(буквально, "указатель наchar
") -
NULL
является константой нулевого указателя (по крайней мере, в моей системе это((void*)0)
) -
''
является символьной константой (на самом деле она имеет типint
, но не беспокойтесь об этом; это обычно используется в контексте, который требуетchar
значение)
посмотреть *
на char *
и 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
направлен в пустая строка (на самом деле, указывая на место памяти, содержащее ноль).
("строка", по определение, "непрерывная последовательность символов, заканчивающаяся первым нулевым символом и включающая его", поэтому, если самый первый символ строки ''
, то строка является пустой строкой.)
str==NULL
указывает, является ли указатель нулевым.
str[0]==''
говорит вам, если строка имеет нулевую длину.
в этом коде тест:
if ((str == NULL) || (str[0] == ''))
используется для улавливания случая, когда он равен нулю или имеет нулевую длину.
обратите внимание, что короткое замыкание играет ключевую роль здесь: смысл теста в том, чтобы убедиться, что str
является допустимой c-строкой длиной не менее 1.
- второй тест
str[0] == ''
будет работать только еслиstr
не равно NULL. - таким образом, первый тест
str == NULL
необходимо вырваться рано, когдаstr
равно NULL.
по сути
-
str == NULL
определяет, является лиstr
этоNULL
указатель -
str[0] == ''
определяет, является лиstr
является 0 длина c строка стиля
когда вы объединяете их, вы проверяете, является ли он нулевым или пустым. Это позволяет функции исключить обе формы пустых данных в начале метода
str == NULL
проверка str является нулевым указателем (указатель в никуда)
str[0] == ''
(если не нулевой указатель) проверка первого элемента str имеет 0-значение (строка без символов только 0-завершена)
str==NULL
говорит вам, является ли строка NULL
.
*str==''
говорит вам, если строка имеет нулевую длину.
Примечание: этот ответ-игра на мистический 15 второй ответ который str==''
. Конечно, изменения, сделанные в первые 3 или 4 минуты, не отображаются, и он исправил это ಠ_ಠ.
str == NULL означает "str указывает на нулевой адрес памяти" (или любой адрес в вашей системе равен нулю). Обычно это означает, что строки вообще нет.
str[0] = = '\0' означает "первый символ str равен нулю" (который отмечает конец строки). Это означает, что есть строка, но она пуста. Подумайте о пустой чашке против никакой чашки вообще; та же идея.
на других языках вы можете написать str == null
vs str == ""
. Они означают две разные вещи. Это особенно важно понять разницу в 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] == ''
определяет, является ли str строкой стиля C длиной 0
Так в этом
if ((str == NULL) || (str[0] == ''))
короткое замыкание оператора OR входит в изображение, поскольку оно гарантирует, что строка не указывает ни на что или на пустую строку..
эквивалент C#:
if (string.IsNullOrEmpty(str))
{
}
простое значение - является ли строка нулевой или пустой строкой.