“cout<<(char *)NULL”在这里做“关闭(1)”吗?

时间:2014-04-25 02:31:34

标签: c++ unix

在下面的代码中,我在此行之后使用了cout<<(char*)NULL;,我的程序没有打印到输出屏幕。这是否意味着我已close(1)cout进行了对比?这里到底发生了什么?这是一个错误吗?请分享您的想法。

#include<iostream>
using namespace std;

void f(){
    cout<<"\nfun\n";
}

main(){
cout<<(char*)NULL;
f(); //not getting printed !
cout<<"\nhello\n";  //not getting printed !
cout<<"hii how are you?"; //not getting printed, why??
}

我在gcc和DevCpp编译器中尝试过这种方法,观察到相同的行为。

3 个答案:

答案 0 :(得分:5)

cout << (char *)NULL导致未定义的行为。什么事情都可能发生。 (编译器假定您在生成汇编代码时不执行此操作)。

此处使用的char *参数必须指向以null结尾的字符串中的字符。

答案 1 :(得分:3)

在此处设置流上的badbit,这会导致在cout<<(char*)NULL;

之后无法打印任何内容
if (!__s)
 __out.setstate(ios_base::badbit);

标准说:requires: shall not be a null pointer。所以你的程序肯定有未定义的行为,应该修复它。您可以使用cout.clear()清除坏位。

在您的情况下,cout<<(char*)NULL;会导致未定义的行为。但GCC安全地播放它。

希望这有帮助!

答案 2 :(得分:2)

(char*)NULL不会将NULL转换为"NULL"之类的字符串,如果这就是您的想法。 NULL实际上是一个扩展为0的宏。将其转换为char*会将其转换为指向零的指针(空指针)。唯一的问题是打印出来。尝试打印空指针是Undefined Behavior。到目前为止,您无法理解您的程序所展示的任何行为。你的程序没有崩溃的事实对我来说是一个惊喜。