2015-06-19 67 views
1

我认为指向NULL的指针可以转换为0。所以我写下面的程序:为什么指向NULL-charater的指针未转换为false

#include <iostream> 
#include <regex> 
#include <string> 
#include <cstdlib> 

bool is_strtoi(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return *p == '\0'; 
} 

bool is_strtoi1(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return p; //Pointer to NULL should be converted to false; 
} 

int main() 
{ 
    std::string test1("123asd2"); 
    std::string test2("123123"); 
    std::cout << is_strtoi1(test1) << std::endl; 
    std::cout << is_strtoi1(test2) << std::endl; 
    std::cout << "---" << std::endl; 
    std::cout << is_strtoi(test1) << std::endl; //prints 1 
    std::cout << is_strtoi(test2) << std::endl; 
} 

Accroding到标准的4.12节:

零值,空指针值,或空构件指针值 转换为false

那么为什么没有?

+2

我在代码的任何地方都看不到一个空指针。 – AnT

回答

11

你是一个间接出去的层! “空指针”和“零/零指针”是两个不同的东西。

在最基本的:

  • 一个空指针本身所具有的价值为零。
  • 它不指向其他值为零的其他对象。

p == 0; // yes 
*p == 0; // no 

事实上,char*指向长度为0(即{'\0'})的C-串是不是一个空指针;这是一个非常有效的指针。

尽管进一步说,指针可以“具有零值”的概念实际上是一个实现细节。抽象地说,指针不是数字,所以我们不会考虑空指针有一个数值如零。这在介绍nullptr关键字时很明显,该关键字不能隐式转换为整数。通过消除整个讨论关于“零”,我们可以改为给出如下改进,更合适的例子:

p == nullptr; // yes 
*p == '\0'; // no 
+2

“一个空指针本身的值为零”=可能是真的,但你不应该再相信了。 p!= nullptr更安全 –

+0

@MartinBeckett:澄清 –

2

你似乎“空指针”将混合了“指针为NULL”(无论后者手段)。您引用的标准文本没有提及任何有关“NULL指针”的内容。您引用的文字清楚明确地指出空指针转换为false

您发布的代码没有任何空指针,即它没有任何具有空指针值的指针。您的代码中的指针p指向str.c_str()缓冲区内的某个有效位置,这意味着p本身不为空。因此,您的代码中没有任何内容会根据标准引用的段落转换为false

3

此代码:

bool is_strtoi1(const std::string& str) 
{ 
    char *p; 
    std::strtol(str.c_str(), &p, 10); 
    return p; //Pointer to NULL should be converted to false; 
} 

仅会返回false如果p地址是NULL。如果strtol的输入字符串不是NULL [在任何行为良好的程序中都不会发生std::string - NULLstrtol的输入是未定义的行为,所以它没有被定义为NULL。在这种情况下为p - 但很可能你会因这种尝试而崩溃]。

换句话说,您转换为bool的前提不正确。

你可以写为:

return *p; 

将返回true,如果在NUL(零)字符p点。

相关问题