1
int main()
{
  char *p,c;
  for(p="Hello World";c=*p;++p)
  {
    printf("%c",c);
  }
}

在上面的代码中,我知道 ++p 将使指针 'p' 指向“Hello World”中的下一个字符。而且我还知道在 C 或 C++ 中没有对数组执行边界检查。程序是“Hello World”。我如何能够测试条件使用

c=*p;

'c=*p' 返回什么。据我了解,当 '++p' 到达 'hello world' 的末尾时,指针 'p' 应该指向一些垃圾值并且循环应该打印一些垃圾价值观。

4

3 回答 3

9

c=*p;不返回任何东西,它是一个表达式。for循环评估赋值后的值c

当'++p'到达'hello world'的末尾时,指针'p'应该指向一些垃圾值

并不真地。在到达结尾之前,它到达空终止字符- '\0'。这是0。它被分配给c并将中断条件评估为false。所以循环在超出范围之前完成。

于 2012-06-27T14:30:10.193 回答
5

C 字符串根据定义以 NULL 字符结尾'\0',如果它是字符串,则必须以 NULL 结尾。因此c = *p,当字符串结束时将指向一个 NULL 字符,在您的情况下,它是'd'. 并且 ASCII 表中的 NULL 字符有一个整数值 0,它的计算结果为 false 并退出for循环。

请注意,如果 C 字符串不以 NULL 字符结尾(那么起初它不是 C 字符串),那么基本上没有办法检测到它是字符串,因为它将被存储为字节序列。在这种情况下,它将只是一个字节数组或一个字符串,这取决于我们如何解释。

也不是c = *p返回任何东西,它是一个表达式,它被评估e = *p将 var 的当前值指向的值传输p到 varc中,其值是表达式的最终计算值。

于 2012-06-27T14:32:54.500 回答
3

字符串以空字符(又名 with \0)终止,因此最后p应该指向终止字符串的空字符,因此c将被\0视为错误条件。

于 2012-06-27T14:30:50.160 回答