这是微不足道的,可能是愚蠢的,但我需要了解在您尝试打印初始化为'\ 0'(或0)的字符指针的内容后,状态cout是什么.看一下以下片段:
const char* str;
str = 0; // or str = '\0';
cout << str << endl;
cout << "Welcome" << endl;
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,第4行在尝试在第3行打印str之后不会将"欢迎"打印到控制台.是否有一些我应该注意的行为?如果我用cout <<'\ 0'<< endl;替换第1-3行; 以下行中的"欢迎"消息将成功打印到控制台.
注意:第4行无声打印无法打印.没有警告或错误消息或任何东西(至少不使用MinGW(g ++)编译器).当我使用MS cl编译器编译相同的代码时,它会引发异常.
编辑:为了消除代码在将str分配给'\ 0' 时失败的概念,我修改了代码以分配给0 - 这是以前评论过的
GMa*_*ckG 12
如果将const char*值插入标准流(basic_ostream<>),则要求它不为null.由于str为null,因此违反了此要求,并且行为未定义.
标准中的相关段落为§27.7.3.6.4/ 3.
它'\0'直接使用的原因是因为'\0'是a char,所以没有要求被打破.然而,Potatoswatter已经说服我打印这个角色是有效的实现定义,所以你看到的可能不是你想要的(也就是说,执行你自己的检查!).
'\0'当有问题的值不是"字符"(空终止字符串或其他字符串的终结符)时,请勿使用.也就是说,我认为,这是你困惑的根源.就像是:
char const* str = "\0";
std::cout << str << std::endl;
Run Code Online (Sandbox Code Playgroud)
很好,其中str指向包含a的字符串'\0'(在本例中为2 '\0').就像是:
char const* str = NULL;
std::cout << str << std::endl;
Run Code Online (Sandbox Code Playgroud)
是未定义的行为; 什么都可能发生.
由于历史的原因(可追溯至C),'\0'并且0将隐式转换为任何指针类型,导致空指针.
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |