Подтвердить что ты не робот

'\ 0' оценивает значение false, "\ 0" оценивает значение true

Вдохновленный программой, описанной в разделе K & R section 5.5:

void strcpy(char *s, char *t)
{
    while(*s++ = *t++);
}

Программа C

if ('\0') { printf("\'\\0\' -> true \n"); }
else      { printf("\'\\0\' -> false\n"); }

if ("\0") { printf("\"\\0\" -> true \n"); }
else      { printf("\"\\0\" -> false\n"); }

печатает

'\0' -> false
"\0" -> true

Почему '\0' и "\0" оцениваются по-разному в C?

clang version 3.8.0

4b9b3361

Ответ 1

Вспомните, как строковые литералы работают в C - "\0" - это массив символов, содержащий два нулевых байта (тот, который вы просили, и неявный в конце). При оценке для теста if он распадается на указатель на его первый символ. Этот указатель не является NULL, поэтому он считается истинным при использовании в качестве условия.

'\0' - это число ноль, эквивалентное просто 0. Это целое число, которое равно нулю, поэтому оно считается ложным при использовании в качестве условия.

Ответ 2

Прежде всего, вам нужно иметь в виду, что в C,

  • Zero является ложным и отличным от нуля является true.
  • Для типов указателей NULL - false, а не NULL - true.

'\0', как говорили другие, совпадает с целым литералом 0 и, следовательно, является ложным (см. первый пункт выше, чтобы узнать, почему).

"\0" - строковый литерал, содержащий два символа \0 (один из которых вы явно добавили, а другой - неявный и будет добавлен компилятором). Строковый литерал будет храниться где-то в постоянной памяти. Когда вы используете "\0", он преобразуется в указатель на свой первый элемент . Это обычно называют распадом массива". (Вот почему работает материал типа char* str = "string";).

Итак, вы эффективно проверяете адрес первого символа строкового литерала. Поскольку адрес строкового литерала всегда будет не NULL, if всегда будет истинным (см. Второй пункт выше, чтобы узнать почему).


: Этот "распад" массивов не всегда случается. См. Исключение для массива, не затухающего в указатель?

Ответ 3

'\0' - это число: 0, поэтому оно оценивается как false (0= false, !0= true).

Но "\0" является указателем на раздел только для чтения, где хранится фактическая строка, указатель не NULL ergo it true.

Ответ 4

Во-первых, глядя на два условия, '\0' является константой целочисленного типа, которая обозначает нулевой символ C, который является таким же, как 0. Пока "\0" является строковым литералом, который содержит 2 байта, тот, который указан, и байт нуль-терминатора неявно добавлен. Будучи строковым литералом, указатель не может быть NULL.

Во-вторых, в C для условия оператора if все ненулевые оцениваются как true, а нуль оценивается как false.

В соответствии с этим правилом будет ясно, что '\0' является false, а "\0" оценен как true.

Ответ 5

Прежде всего, обратите внимание, что шестнадцатеричное значение False равно 0x00, а True - любое другое значение, чем 0x00.

"\0" - это строка с символом и Null Terminator '\0' в конце. Таким образом, это указатель на символ, указывающий на массив из 2 байтов: ['\0', '\0']. В этом массиве первая является символом, а другая - нулевым терминатором.

После компиляции (без оптимизации) этот указатель на символ временно присваивается адресу в памяти, указывающему на первый байт этих двух байтов. Этот адрес может быть, например, 0x18A6 в шестнадцатеричном формате. Поэтому компилятор (большинство из них) фактически записывает эти два значения в память. Поскольку строка на самом деле является адресом первого байта этой строки, наше выражение интерпретируется как 0x18A6 != false. Итак, ясно, что 0x18A6 != 0x00 имеет значение True.

'\0' просто 0x00 в шестнадцатеричном формате. 0x00 != 0x00 - False.

Этот ответ написан для 8-битной архитектуры данных с 16-разрядной адресацией. Надеюсь, что это поможет.

Ответ 6

'\ 0' - это символ null, который имеет значение 0. Он используется для завершения строки символов. Поэтому он считает false.

"\ 0" - это строка null или пустая . Единственный символ в строке - это нулевой символ, который завершает строку. Поэтому он считает true.

Ответ 7

Мы можем прояснить выше проблему в двух разных понятиях C

  • Работа if (условие) в C
  • Различие символов и строковых литералов в C

1. Работа if (условие) в C если (условие)

В языке C, если условие работает на базе 0 (нуль) и без нуля.

Если результатом данного условия является Zero, то C считает, что данное условие ложно.

Если результатом данного условия является Non-Zero, то C считает, что данное условие истинно.

2. Различие символов и струнных литералов в C

В C строковыми литералами являются те, которые заключены в двойные кавычки (""), а символьные литералы - это те, которые заключены в одинарные кавычки (''), а минимальная длина - один символ, а максимальная длина - два символа.

Еще один важный момент в том, что в C, если мы преобразуем '\ 0' (null) в int (Integer), тогда мы получим 0 (Zero), в то время как мы не можем преобразовать "\ 0" в int неявно или явно. Поскольку "\ 0" - это строка, а "\ 0" - символ.

И согласно строковой логике IF условия, если условие возвращает 0 или false, это означает, что условие является ложным; в случае, если условие возвращает ненулевое значение, это означает, что условие истинно.

Итак, согласно пунктам 1 и 2, наконец, можно заключить, что

if ('\ 0') printf ( "\ '\ 0 \'!= false\n" );//условие становится false

if ( "\ 0" ) printf ( "\" \0\ "!= false\n" );//условие становится истинным

Ответ 8

'\ 0' является char, равным нулевому числу. "\ 0" - это строка, и мы обычно добавляем "\ 0" в конце строки. Не используйте "\ 0" или "\ 0" в условных операторах, потому что это довольно запутанно.

Предлагается следующее использование:

if (array[0] != 0)
{

}

if (p != 0)
{

}

if (p != NULL)
{

}

Ответ 9

Посмотрите на это с примерами.

#include <stdio.h> 

int main() 
{ 
printf( "string value\n" ); 

//the integer zero 
printf( "0.........%d\n" , 0 ); 

//the char zero, but chars are very small ints, so it is also an int 
//it just has some special syntax and conventions to allow it to seem 
//like a character, it actual value is 48, this is based on the 
//ASCII standard, which you can look up on Wikipedia 
printf( "'0'.......%d\n" , '0' ); 

//because it is an integer, you can add it together, 
//'0'+'0' is the same as 48+48 , so it value is 96 
printf( "'0'+'0'...%d\n" , '0'+'0' ); 

//the null terminator, this indicates that it is the end of the string 
//this is one of the conventions strings use, as a string is just an array 
//of characters (in C, at least), it uses this value to know where the array 
//ends, that way you don't have to lug around another variable to track 
//how long your string is. The actual integer value of '\0' is zero. 
printf( "'\\0'......%d\n" , '\0' ); 

//as stated, a string is just an array of characters, and arrays are tracked 
//by the memory location of their first index. This means that a string is 
//actually a pointer to the memory address that stores the first element of 
//the string. We should get some large number, a memory address 
printf( "\"0\".......%d\n" , "0" ); 

//a string is just an array of characters, so lets access the character 
//in position zero of the array. it should be the character zero, which 
//has an integer value of 48 
printf( "\"0\"[0]....%d\n" , "0"[0] ); 

//and the same thing for the empty string 
printf( "\"\\0\"[0]...%d\n" , "\0"[0] ); //equal to '\0' 

//we also said a string is just a pointer, so we should be able to access 
//the value it is pointing to (the first index of the array of characters) 
//by using pointers 
printf( "*\"0\"......%d\n" , *"0" ); 

return 0; 
}

Ответ 10

Простая вещь: ATLEAST 0 (int) и 0.0 (float или double) имеют значение FALSE в C.

"\ 0" - это целое число 0.

"\ 0" - это массив символов. Неважно, что ВНУТРИ массива, сколько символов есть или что это за символы.

Таким образом, '\ 0' оценивается в 0, как 77-77 оценивается в 0. И 0 ложно.

int x; x = '\0'; printf("X has a value: %d"); Выход:


х имеет значение: 0

И код:

if(0){printf("true");}

else{printf("false");}

Выход:


ложный