cout<<'\0';结果为a?

omyhao 2015-01-28 12:52:00
#include<iostream>
using namespace std;
int main()
{

char a[2] = { 's', '\0' };
cout << a[1] << endl;
cout << '\0' << endl;
return 0;
}

无论是第一个输出,还是第二个输出,结果都显式是a。想不明白,理论上应该什么都没有,但是输出结果。。。
环境是VS2013。
结果图片:
...全文
737 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
omyhao 2015-01-30
  • 打赏
  • 举报
回复
引用 31 楼 lin5161678 的回复:
[quote=引用 13 楼 shenhaonan 的回复:]
[quote=引用 7 楼 lin5161678 的回复:]
'\0' 在ascii里面是不可显示字符
你命令计算机给你 显示一个不可显示字符
计算机 (╯‵□′)╯︵┻━┻

虽然是不可显示字符,那按照程序输出应该是什么也没有,直接两个换行输出,程序停留在按任意键继续那一步。可是,计算机现在显式出了两个它不该现实的两个a。
ps:你的那个回复板砖是我手贱点了一下。。。见谅,pps:我就是想看一下,点了以后可不可以取消,没想到。。取消不了[/quote]既然是不可显示字符 那么干嘛输出什么都没有
你所谓的输出什么都没有和 输出空格 重叠了 OK?
而空格是一个可显示字母

我就直说了吧 输出不可显示字符会输出什么是无法确定 [/quote]
我觉的不是这样的,本来不可显式字符就没有什么输出。而你说的输出什么都没有和输出空格重叠了,我觉得有问题,程序没有输出空格。如果假设编译器没有错误(因为我现在也没有弄清楚哪里出了问题),那么输出结果应该是如30楼所示的情况。
引用 30 楼 luckylucky028 的回复:

而这里的两个空行的原因是程序中有两个endl,因为endl的作用就是换行刷新缓冲区。而非你说的空格
比如:

如过我的编译器没有错的话:请按任意键继续这句话应该是顶住左边框输出。
赵4老师 2015-01-30
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
lin5161678 2015-01-30
  • 打赏
  • 举报
回复
引用 13 楼 shenhaonan 的回复:
[quote=引用 7 楼 lin5161678 的回复:] '\0' 在ascii里面是不可显示字符 你命令计算机给你 显示一个不可显示字符 计算机 (╯‵□′)╯︵┻━┻
虽然是不可显示字符,那按照程序输出应该是什么也没有,直接两个换行输出,程序停留在按任意键继续那一步。可是,计算机现在显式出了两个它不该现实的两个a。 ps:你的那个回复板砖是我手贱点了一下。。。见谅,pps:我就是想看一下,点了以后可不可以取消,没想到。。取消不了[/quote]既然是不可显示字符 那么干嘛输出什么都没有 你所谓的输出什么都没有和 输出空格 重叠了 OK? 而空格是一个可显示字母 我就直说了吧 输出不可显示字符会输出什么是无法确定
paschen 版主 2015-01-30
  • 打赏
  • 举报
回复
ASCII编码的可打印字符是0x20~0x7E 除了‘\0’,其他那些不可打印的输出的都是你想不到的图形。。
lin5161678 2015-01-30
  • 打赏
  • 举报
回复
引用 33 楼 u011956816 的回复:
请把这句话 仔细读10次 遇到不理解的单词 请翻阅汉语词典 谢谢合作 我就直说了吧 输出不可显示字符会输出什么是无法确定
lin5161678 2015-01-30
  • 打赏
  • 举报
回复
引用 34 楼 paschen 的回复:
楼上都没解释清楚: 是因为在DEBUG下,如果'\0'前面没有内容,编译器用a代替‘\0’,以便让我们可以发现是哪出现了问题 楼主不信试下RELEASE下,此时将不会输出任何内容!!
别乱说 DEBUG会填充的只有 CD 和 CC 分别属于栈未初始化内存 和 堆未初始化内存 和这段代码 毫无关系
paschen 版主 2015-01-30
  • 打赏
  • 举报
回复
不好意思,上面说错了,经过寻找,发现这是正常的: ‘\0’在字符串出现的时候,是作为字符串结束标志,不输出 但作为字符,用putchar是可以输出的,具体显示什么“图案”与ASCII 字模有关
paschen 版主 2015-01-30
  • 打赏
  • 举报
回复
楼上都没解释清楚: 是因为在DEBUG下,如果'\0'前面没有内容,编译器用a代替‘\0’,以便让我们可以发现是哪出现了问题 楼主不信试下RELEASE下,此时将不会输出任何内容!!
luckylucky028 2015-01-29
  • 打赏
  • 举报
回复
luckylucky028 2015-01-29
  • 打赏
  • 举报
回复
百曉生 2015-01-29
  • 打赏
  • 举报
回复
引用 15 楼 shenhaonan 的回复:
[quote=引用 8 楼 u012421456 的回复:] 不应该啊!该是什么都没有啊 要不楼主新建工程文件试试?也可以再换个IDE
新建工程结果还是一样,我在线编译了一下,结果正确,所以是编译器的问题?[/quote] 那应该就是你的环境问题吧,反正我的gcc4.6.3是什么都没有
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<iostream>
using namespace std;
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
int main()
{

    char a[2] = { 's', '\0' };
    HexDump(&a[1],1,(int)(&a[1]));//cout << a[1] << endl;
    //cout << '\0' << endl;
    return 0;
}
//0012ff6d - 00                                               .
//
omyhao 2015-01-29
  • 打赏
  • 举报
回复
引用 27 楼 zhao4zhong1 的回复:
看不懂汇编指令的话,学汇编。
首先,谢谢老师这么细心的指导。由于自己知识点的欠缺,对老师指出的一些关键点还是不理解。假期之间把汇编看了之后,再继续和老师探讨。
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
看不懂汇编指令的话,学汇编。
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
引用 22 楼 u011956816 的回复:
[quote=引用 21 楼 zhao4zhong1 的回复:] 理解讨论之前请先学会如何观察
老师,下面的是汇编代码: 可是看不懂。。老师看一下问题在哪里[/quote] 在汇编窗口中,执行到 00DF5E4D E8 40 B6 FF FF call std::operator<<<... 这一行时,按F11键,几次之后,就会来到相应C++源代码处。
mujiok2003 2015-01-29
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
'\0' 在ascii里面是不可显示字符 你命令计算机给你 显示一个不可显示字符 计算机 (╯‵□′)╯︵┻━┻
++
zzzzyu 2015-01-29
  • 打赏
  • 举报
回复
我VS13下面输出都是空
omyhao 2015-01-29
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察

老师,下面的是汇编代码:

可是看不懂。。老师看一下问题在哪里
赵4老师 2015-01-29
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察
加载更多回复(18)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧