В чем разница между 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.

746   10  

10 ответов:

важно помнить, что str на самом деле это не "строка", а скорее указатель в ячейку памяти, где a char (часть строки) сохраняется.

Далее, мы должны понять, как компилятор видит все эти предметы. Давайте посмотрим на их типы:

  • str типа char * (буквально, "указатель на char")
  • NULL является константой нулевого указателя (по крайней мере, в моей системе, это ((void*)0))
  • '' является символьной константой (это на самом деле типа int, но не беспокойтесь об этом; это обычно используется в контексте, который требует char значение)

посмотреть * in 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 направлен в пустая строка (фактически, указывая на ячейку памяти, содержащую ноль).

("строка", 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 == 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] == '')) короткое замыкание оператора OR входит в изображение, поскольку оно гарантирует, что либо строка не указывает ни на что, либо на пустую строку..

C# эквивалент этого:

if (string.IsNullOrEmpty(str))
{

}

простой смысл заключается в том, является ли строка нулевой или пустой строкой.

Comments

    Ничего не найдено.