'\ 0'评估为false,“\ 0”评估为true
受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中的评估方式不同?
铿锵的版本3.8.0
回想一下C中的string是如何工作的 – "\0"
是一个包含两个零字节的字符数组(你要求的字节数和最后的隐含字节数)。 如果对if
testing进行评估,则会衰减为指向其第一个字符的指针。 这个指针不是NULL,所以在用作条件时它被认为是真的。
'\0'
是数字零,相当于只有0
。 它是一个零的整数,所以在作为条件使用时被认为是错误的。
首先,你需要记住在C中,
- 零是假的,非零是真的。
- 对于指针types,
NULL
是假的,非NULL
是真的。
正如其他人所说的, '\0'
与整数字面量0
相同,因此是'假'(见上面第一个要点知道原因)。
"\0"
是一个包含两个\0
字符的string(一个是你明确添加的,另一个是隐含的,并且会被编译器添加)。 string文字将被存储在只读存储器的某处。 当你使用"\0"
,它被转换成一个指向它的第一个元素的指针 。 这通常被称为“ arrays衰减 ”。 (这是为什么东西像char* str = "string";
作品)的原因。
所以, 你正在有效地检查string文字的第一个字符的地址 。 由于string文字的地址将始终为非NULL
,因此if始终为真(请参阅上面的第二个项目符号点以了解原因)。
† :arrays的“衰减”并不总是会发生。 请参阅数组的exception不腐朽成指针?
'\0'
是一个数字: 0
,所以它被评估为false( 0
= false, !0
= true)。
但是"\0"
是一个指向实际string存储的只读部分的指针,指针不为NULL
这是真的。
首先看两个条件, '\0'
是一个整数types的常量,表示空字符C,与0
相同。 "\0"
是一个string,它包含2个字节,指定的string和隐式添加的空字符结束符。 作为一个string文字,指针不能为NULL
。
其次,在C中,对于if
语句的条件,所有非零值都被评估为true
,并且零被评估为false
。
根据这个规则,很明显'\0'
是false
, "\0"
评估为true
。
首先请注意False的hex值是0x00
,True是0x00以外的值。
"\0"
是一个带有字符的string,末尾为空终止符'\0'
。 所以它是一个字符指针,指向一个2字节的数组: ['\0', '\0']
。 在这个数组中,第一个是字符,另一个是空终止符。
在编译之后(不进行优化),这个字符指针暂时分配给内存中指向这两个字节的第一个字节的地址。 例如,该地址可能是hex的0x18A6
。 所以编译器(其中大部分)实际上将这两个值写入内存。 因为string实际上是该string的第一个字节的地址,所以我们的expression式被解释为0x18A6 != false
。 所以,清楚的是0x18A6 != 0x00
是真的。
'\0'
只是hex的0x00
。 0x00 != 0x00
是假的。
这个答案是写入8位数据架构与16位寻址。 我希望有帮助。
'\ 0'是一个空字符,其值为0 。 它用于终止一串字符。 所以这是错误的。
“\ 0”是一个空或空 string 。 string中唯一的字符是终止string的空字符。所以它被认为是真的。
我们可以在C的两个不同的概念上清楚上面的问题
- if(condition)在C中的工作
- C中字符与字面量的区别
1. if(condition)在C中的工作 if(condition)
在C语言中,如果条件在0(零)和非零基础上工作。
如果给定条件的结果是零,那么C认为给定的条件是错误的。
如果给定条件的结果是非零,那么C认为给定的条件是真的。
2. C中字符和string的区别
在C中,string文字是用双引号(“”)括起来的,而字符文字是用单引号('')括起来的,最小长度是一个字符,最大长度是两个字符。
另一个重点是在C中,如果我们将'\ 0'(空)转换为int(整数),那么我们将得到0(零),而我们不能隐式或显式地将“\ 0”转换为int。 因为“\ 0”是string,而“\ 0”是字符。
而根据stringIF条件的工作逻辑,如果条件返回0或false,则表示条件为false; 如果条件返回非零,则表示条件成立。
所以,根据第一点和第二点我们可以得出这样的结论
if('\ 0')printf(“\'\ 0 \'!= false \ n”); //条件变成错误
if(“\ 0”)printf(“\”\ 0 \“!= false \ n”); //条件成真
'\ 0'是一个等于零的字符。 “\ 0”是一个string,我们通常在string的末尾添加“\ 0”。 不要在条件语句中使用“\ 0”或“\ 0”,因为它很混乱。
build议使用以下用法:
if (array[0] != 0) { } if (p != 0) { } if (p != NULL) { }
看看这个例子..
#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; }