'\ 0'计算为false,"\ 0"计算为true

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.它是一个零的整数,因此当用作条件时它被认为是假的.

  • 是的,字符串文字是char数组 (20认同)
  • 这个"*`"\ 0"`是一个指向字符数组的指针*"并不适合28 ++投票的答案,因为它在两个方面都是错误的.`"\ 0"不是一个指针,而是一个数组,如果由于任何原因它不会指向数组而是指向第一个元素,这个数组会被衰减为指针. (7认同)
  • @MM:这是一个字符串文字;) (4认同)
  • @MrLister指向数组的指针和指向数组元素的指针是两种不同的动物. (4认同)
  • @MrLister`char(*ptr)[] =&"test";`将是指向字符串文字的指针,而`char*ptr ="test";`将是指向字符串第一个字符地址的指针字面上的"测试". (4认同)
  • @MrLister:"*任何指向数组的指针始终也是指向其第一个元素的指针.*"按值更正,按类型错误. (4认同)

Spi*_*rix 35

首先,你需要记住在C中,

  • 零为假,非零为真.
  • 对于指针类型,NULL为false且non NULL为true.

'\0'正如其他人所说的那样,它与整数文字相同0,因此是错误的(参见上面的第一个要点知道原因).

"\0"是一个字符串文字,包含两个\0字符(一个是您明确添加的,另一个是隐式的,将由编译器添加).字符串文字将存储在只读内存中的某个位置.使用时"\0",它会转换为指向其第一个元素的指针.这通常被称为" 阵列衰减 ".(这就是为什么像char* str = "string";工作的原因).

因此,您正在有效地检查字符串文字的第一个字符的地址.由于字符串文字的地址始终为非NULL,因此if将始终为true(请参阅上面的第二个要点以了解原因).


:数组的"衰减"并不总是发生.请参见异常数组不衰减成指针?

  • 另外,我不确定`unsigned`和`signed`是如何相关的.我的意思是`unsigned`或`signed`,`char`或`int`,都可以代表0. (4认同)
  • ''\ 0'`是一个`int`,IIRC,虽然它_looks_就像`char`. (2认同)
  • 请注意,“\0”在 C++ 中将是“char”,尽管它在 C 中是“int”。 (2认同)

小智 15

'\0'是一个数字:0,因此它被评估为false(0= false,!0= true).

但是"\0"是指向存储实际字符串的只读部分的指针,指针不是NULL正确的.