为什么这个代码来自Bjarne" Tour of C ++"有效?

时间:2015-04-05 20:20:01

标签: c++ arrays pointers

如果我们将一个数组传递给函数,我们遍历它直到“p”是一个nullptr。但这绝不应该发生,因为数组中值为0的最后一个元素之后的地址不是nullptr(没有值为零)。这怎么可能?

int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-ter minated array of char (or to nothing)
{
  int count = 0;
  while (p) {
    if (*p==x)
      ++count;
    ++p;
  }
  return count;
}

2 个答案:

答案 0 :(得分:7)

该功能无效。您的本书版本包含错误。正确的版本会在*p条件下测试while

int count_x(char* p, char x)
    // count the number of occurrences of x in p[]
    // p is assumed to point to a zero-terminated array of char (or to nothing)
{
    int count = 0;
    while (*p) {
//         ^----------------- You omitted this asterisk.
        if (*p==x)
            ++count;
        ++p;
    }
    return count;
}

更新:代码显然在打印之间有所改变,the errata for the first printing提到了与此功能相关的错误。帽子提示@BenVoigt。

答案 1 :(得分:3)

代码错了。

while条件需要

while(*p)

而不是

while(p)

编辑:也在勘误表中找到它 - http://www.stroustrup.com/Tour_printing2.html

  

第11-12页:count_if()的代码是错误的(没有按照它声称的那样做   to),但关于语言的观点是正确的。