我以为指针指向NULL可以转换为0.所以我写了以下程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
根据标准的4.12部分:
零值,空指针值或空成员指针值将转换为false
那为什么不呢?
Lig*_*ica 11
你是一个间接的层!"空指针"和"指向空/零的指针"是两个不同的东西.
最基本的:
p == 0; // yes
*p == 0; // no
Run Code Online (Sandbox Code Playgroud)
实际上,char*指向长度为0(即{'\0'})的C字符串不是空指针; 它是一个完全有效的指针.
然而,更进一步,指针可以"具有零值"的概念实际上是一个实现细节.在抽象术语中,指针不是数字,因此我们不会将空指针视为具有诸如零的数值.这在引入nullptr无法隐式转换为整数的关键字时很明显.通过删除关于"零"的整个讨论,我们可以提供以下改进的,更合适的示例:
p == nullptr; // yes
*p == '\0'; // no
Run Code Online (Sandbox Code Playgroud)