我在「A巡迴賽的C++」,第12頁看到了以下功能:「C++遊覽」或非兼容編譯器中的Buggy代碼?
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;
}
這讓我三思而後結論這是越野車代碼。兩個版本似乎都是越野車。
這段代碼絕對看起來很奇怪。是否有任何理由懷疑編譯器不符合C++ 11標準? (另外,它們展示的代碼絕對不是很好的C++代碼 - 它應該使用'std :: string'和'std :: count'算法〜) – templatetypedef
@templatetypedef,我將很難指向一個手指在C++的父親的一本書中的代碼中,並將其稱爲越野車,但沒有確保幾次,我沒有失去我的想法:) :) –
@templatetypedef,該函數出現在本書的第一章,基礎知識。有意義的是,他不會跳入'std :: string'和'std :: count'。 –