受 K& R 第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
答案 0 :(得分:112)
回想一下C字符串文字是如何工作的 - "\0"
是一个包含两个零字节的字符数组(你要求的那个,最后是隐含的字节)。当评估if
测试时,它会衰减成指向其第一个字符的指针。该指针不是NULL,因此当用作条件时它被认为是真的。
'\0'
是零,相当于0
。它是一个零的整数,因此当用作条件时它被认为是假的。
答案 1 :(得分:34)
首先,你需要记住在C中,
NULL
为false,非NULL
为真。 '\0'
与整数文字0
相同,因此是错误的(请参阅上面的第一个要点以了解原因)。
"\0"
是一个字符串文字,包含两个\0
个字符(一个是您明确添加的,另一个是隐式的,将由编译器添加)。字符串文字将存储在只读存储器中的某处。 当您使用"\0"
时,它会转换为指向其第一个元素的指针 †。这通常被称为“array decay”。 (这就是像char* str = "string";
这样的东西有用的原因。)
所以,你正在有效地检查字符串文字的第一个字符的地址。由于字符串文字的地址始终为非NULL
,因此if将始终为true(请参阅上面的第二个要点以了解原因)。
†:数组的“衰减”并不总是发生。见Exception to array not decaying into a pointer?
答案 2 :(得分:15)
'\0'
是一个数字:0
,因此评估为false(0
= false,!0
= true)。
但"\0"
是一个指向只读部分的指针,其中存储了实际的字符串,指针不是NULL
而是正确的。
答案 3 :(得分:3)
首先,查看这两个条件,'\0'
是一个整数类型的常量,表示空字符C,它与0
相同。虽然"\0"
是一个字符串文字,其中包含2个字节,但是指定的字节和隐式添加的空终止符字节。作为字符串文字,指针不能是NULL
。
其次,在C中,对于if
语句的条件,所有非零都被评估为true
,零被评估为false
。
根据此规则,很明显'\0'
为false
,"\0"
评估为true
。
答案 4 :(得分:1)
首先,请注意False的十六进制值为0x00
,True为除0x00之外的任何其他值。
"\0"
是一个字符串,末尾有一个Null Terminator '\0'
。所以它是一个字符指针,指向一个2字节的数组:['\0', '\0']
。在这个数组中,第一个是字符,另一个是空终止符。
编译后(未优化),该字符指针暂时分配给内存中指向这两个字节的第一个字节的地址。例如,该地址可能是十六进制的0x18A6
。因此编译器(大多数)实际上将这两个值写入内存。因为字符串实际上是该字符串的第一个字节的地址,所以我们的表达式被解释为0x18A6 != false
。所以,很明显0x18A6 != 0x00
是真的。
'\0'
只是十六进制的0x00
。 0x00 != 0x00
是假的。
这个答案是针对具有16位寻址的8位数据架构而编写的。我希望有所帮助。
答案 5 :(得分:0)
'\ 0'是 null 字符,其值为 0 。它用于终止一串字符。所以这是假的。
“\ 0”是 null 或空 字符串。字符串中唯一的字符是空字符,它终止字符串。所以它被认为是真的。
答案 6 :(得分:0)
我们可以在C
的两个不同概念中清楚上述问题<强> 1。在C 中使用if(条件) if(条件)
在C语言中,如果条件适用于0(零)和非零基础。
如果给定条件的结果为零,则C认为给定条件为假。
如果给定条件的结果为非零,则C认为给定条件为真。
<强> 2。性格差异与C语言中的字符串文字
在C中,字符串文字是用双引号(“”)括起来的字符串,而字符文字是用单引号('')括起来的字符文字,最小长度是一个字符,最大长度是两个字符。 / p>
另一个重点是在C中,如果我们将'\ 0'(null)转换为int(整数),那么我们将得到0(零),而我们不能隐式或显式地将“\ 0”转换为int。因为“\ 0”是字符串,而“\ 0”是字符。
根据字符串IF条件工作逻辑,如果condition返回0或false,则表示condition为false;如果条件返回非零,则表示条件为真。
所以,根据第1点和第2点,最后我们可以得出结论
if('\ 0')printf(“\'\ 0 \'!= false \ n”); //条件变为假
if(“\ 0”)printf(“\”\ 0 \“!= false \ n”); //条件变为真实
答案 7 :(得分:0)
'\ 0'是一个等于数字零的字符。 “\ 0”是一个字符串,我们通常在字符串的末尾添加'\ 0'。不要在条件语句中使用'\ 0'或“\ 0”,因为它很混乱。
建议使用以下用法:
if (array[0] != 0)
{
}
if (p != 0)
{
}
if (p != NULL)
{
}
答案 8 :(得分:0)
使用示例查看此内容..
#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's 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's 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;
}
答案 9 :(得分:0)
简单的事情是ATLEAST 0(整数)和0.0(浮点数或双精度数)在C中的值为FALSE。
'\ 0'是整数0。
“ \ 0”是一个字符数组。在数组中插入多少个字符或这些字符是什么都没关系。
因此,“ \ 0”的取值为0,就像77-77的取值为0。 而0为假。
int x;
x = '\0';
printf("X has a value : %d");
输出:
x的值是0
和代码:
if(0){printf("true");}
else{printf("false");}
输出:
false