Rah*_*ahn 56 c arrays string null kernighan-and-ritchie
灵感来自K&R第5.5节中描述的程序:
void strcpy(char *s, char *t)
{
while(*s++ = *t++);
}
Run Code Online (Sandbox Code Playgroud)
C程序
if ('\0') { printf("\'\\0\' -> true \n"); }
else { printf("\'\\0\' -> false\n"); }
if ("\0") { printf("\"\\0\" -> true \n"); }
else { printf("\"\\0\" -> false\n"); }
Run Code Online (Sandbox Code Playgroud)
版画
'\0' -> false
"\0" -> true
Run Code Online (Sandbox Code Playgroud)
为什么'\0'和"\0"评价不同的C 2
clang版本3.8.0
use*_*751 112
回想一下字符串文字在C中"\0"是如何工作的 - 是一个包含两个零字节的字符数组(你要求的那个,最后是隐含的字节).当评估if测试时,它会衰减成指向其第一个字符的指针.该指针不是NULL,因此当用作条件时它被认为是真的.
'\0'数字为零,相当于0.它是一个零的整数,因此当用作条件时它被认为是假的.
Spi*_*rix 35
首先,你需要记住在C中,
NULL为false且non NULL为true.'\0'正如其他人所说的那样,它与整数文字相同0,因此是错误的(参见上面的第一个要点知道原因).
"\0"是一个字符串文字,包含两个\0字符(一个是您明确添加的,另一个是隐式的,将由编译器添加).字符串文字将存储在只读内存中的某个位置.使用时"\0",它会转换为指向其第一个元素† 的指针.这通常被称为" 阵列衰减 ".(这就是为什么像char* str = "string";工作的原因).
因此,您正在有效地检查字符串文字的第一个字符的地址.由于字符串文字的地址始终为非NULL,因此if将始终为true(请参阅上面的第二个要点以了解原因).
†:数组的"衰减"并不总是发生.请参见异常数组不衰减成指针?