“A Tour of C ++”中的错误代码或不兼容的编译器?

时间:2014-03-06 22:23:00

标签: c++ c++11 g++

我在“A Tour of C ++”中看到了以下功能,第12页:

int count_x(char const* p, char x)
{
   int count = 0;
   while (p)
   {
      if (*p == x) ++count;
      ++p;
   }
   return count;
}

while (p)行对我来说听起来不对。我认为它应该是while (*p)。但是,我不想过于放肆,我用下面的代码测试了这个函数。

int main(int argc, char** argv)
{
   char* p = argv[1];
   char x = argv[2][0];
   int count = count_x(p, x);

   std::cout
      << "Number of occurences of "
      << x << " in " << p << ": " << count << std::endl;
   return 0;
}

当我运行该程序时,它以Segmentation fault (core dumped)退出。我很高兴看到这个错误,因为代码看起来不适合我开始。但是,现在很好奇。书中建议的代码是不正确的还是编译器不符合C ++ 11?编译器是g ++(GCC)4.7.3。

使count_x的代码奇怪的是作者Bjarne Stroustrup在完成我首先写的那个之前从下面的实现开始。

int count_x(char const* p, char x)
{
   if(p==nullptr) return 0;
   int count = 0;
   for (; p!=nullptr; ++p)
   {
      if (*p == x)
         ++count;
   }
   return count;
}

在结束这是错误的代码之前,我让我三思而后行。两个版本似乎都是错误的。

2 个答案:

答案 0 :(得分:5)

这列在Errata for 2nd printing of A Tour of C++

  

第1章:

     

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

第二次印刷中的代码现为:

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

The C++ Programming Language (4th Edition)中有一个类似的例子,其中 C ++ 是基于它的,但它没有这个错误。

答案 1 :(得分:3)

gcc在4.7.3具有良好的兼容性,但你必须使用-std = c ++ 11进行编译。 gnu webpage上有图表。但是,这不是一个标准的东西,指针永远不会是NULL,至少直到它溢出,所以除非你已经分配了char *之上的所有内存,否则它将是段错误。这只是一个错误。