C++基础问题,请帮忙深入解答

秋的红果实 2019-03-12 11:04:15
1、如下代码

char *b=new char[5];
b[0] = 'P';
b[1] = 'b';
b[2] = 'c';

b[4] = 'E';

cout<<b<<endl;


输出Pbc
我认为开辟了5字节的连续空间,第四个存储空间没有初始化,第五个元素(E)为什么也被截断?
第四个存储单元或许有以前程序使用过的垃圾,也会输出吧

2、在windows下运行的CodeBlocks,long和int可放的最大数值一样,都是21...,十位数,本来long应该可以放19位数的。
在centOS7下的CodeBlocks正常,windows下的VS也正常
这个是为什么?决定于什么因素

3、double和float有效数字都是6位,10/3=3.33333,我觉得定义为double类型,小数位应该更多,但现实是:都一样?
...全文
327 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2019-03-16
  • 打赏
  • 举报
回复
引用 13 楼 uouo88 的回复:
1.变量没有初始化的时候,内存里面的值是无法预测的啊,每次变化不是很正常么? 2.是显示问题,看起来都是6位,是因为没有设置小数位显示的精度,你可以试试printf("%.20lf",XXX);这种形式来看float和double的精度区别。 3.不同编译器有不同的实现,int和long两种类型,C++并没有强制标准必须要存多大,占多少字节,不必纠结这个
不好意,应该给你分,结帖太快了,没看清,下次补偿吧
uouo88 2019-03-14
  • 打赏
  • 举报
回复
1.变量没有初始化的时候,内存里面的值是无法预测的啊,每次变化不是很正常么?
2.是显示问题,看起来都是6位,是因为没有设置小数位显示的精度,你可以试试printf("%.20lf",XXX);这种形式来看float和double的精度区别。
3.不同编译器有不同的实现,int和long两种类型,C++并没有强制标准必须要存多大,占多少字节,不必纠结这个
@风轻云淡_ 2019-03-14
  • 打赏
  • 举报
回复
不是很明白为什么要费尽心思的去搞清楚一个没赋值没初始化的变量会输出什么。每个IDE都会有它自己的一些处理,就拿这种没有赋值没有初始化的变量来说,有的IDE可能会处理成默认值,有的就不做处理,但是在我看来,定义变量的时候要初始化,这在我这已经根深蒂固了。
测试精度:
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
float a= 1.0;
float b= 3.0;
double c = 1.0;
double d = 3.0;
cout << fixed << setprecision(50) << a/b << endl;
cout << fixed << setprecision(50) << c/d << endl;
return 0;
}

秋的红果实 2019-03-14
  • 打赏
  • 举报
回复
自己顶一下
秋的红果实 2019-03-14
  • 打赏
  • 举报
回复
1、3搞明白了 问题2,再多问下, 现在是在codeblocks下有这个问题,哪位经常使用这个开发工具,是不是在哪里设置下,就可以了,就像VS里指定生成64位还是32位一样 大家都提到了编译器,我使用的编译器,是默认的GNU GCC 假如开发的项目正好涉及到较大的数,超过了10位数,于是使用long,结果long和int一样最大可以放10位数,这就悲剧了
  • 打赏
  • 举报
回复
关于第一个问题,你知道\0是字符串的结束符号,你去查查,\0对应的字面值其实是0,所以输出的时候会在第4个元素的位置被截断,他认为这个值就是\0
ch_jm0723 2019-03-13
  • 打赏
  • 举报
回复
2L 正解 如果未初始化,大概率不是因为截断,而是将第四个字节的默认值作为扩展编码进行了处理,使其与第五个字节共同作为一个汉字进行解析,后面也如此,直打碰到/0结束
秋的红果实 2019-03-13
  • 打赏
  • 举报
回复
感谢各位了! 还是有些模糊 问题1、如果是int数组,看下面代码

    int *n=new int[3];
    n[0]=100;
    n[2]=200;
    cout<<n[1]<<endl;
输出一个较大数字,且多次运行,这个数字还不同 2# @棉猴,“b[3]b[4]两个值合起来”,还是疑惑,为什么前面的b[0]b[1]b[2]就没合。这个在解释乱码问题 问题3、如下代码

    float f1=10.0;
    float f2=3.0;
    cout<<"float output:"<<f1/f2<<endl;

    double d1=10.0;
    double d2=3.0;
    cout<<"double output:"<<d1/d2<<endl;
输出的都是3.33333,我意思是对double,尾部应该有更多个3(小数部分)。难道是输出显示成这样了 问题3、确认是64位win7,long和int一样可放的最大数是10位数(21....) 至于long最大19位,是用(numeric_limits<long>::max)()得出的
uouo88 2019-03-13
  • 打赏
  • 举报
回复
关于第一个问题,我还想补充一下,如果你只是想初始化一个字符串,没必要这么写,会很麻烦,可以用strcpy函数来初始化,形式如下:
char *b=new char[5];
strcpy(b,"pbc");
delete []b;
这样初始化写起来会方便点吧
uouo88 2019-03-13
  • 打赏
  • 举报
回复
第1个问题,应该下面这样初始化才对,其中b[4]不会被输出,因为b[3]已经把它截断了
char *b=new char[5];
b[0] = 'P';
b[1] = 'b';
b[2] = 'c';
b[3] = '\0';
b[4] = 'E';

cout<<b<<endl;

第2个问题,int 和 long这两个类型在不同的编译器、32位和64位操作系统上可能存储的最大值都不同,这个是很正常的,一般微软的VS系列,在32位的操作系统下,int 和 long都是占4个字节32位,在64位的操作系统下,int 是4个字节32位,long一般是8个字节,64位


第3个问题,“double和float有效数字都是6位” 这句话不对,double的精度要远高于float
lin5161678 2019-03-13
  • 打赏
  • 举报
回复
引用
double和float有效数字都是6位
谁说都是6位了? 你都不看书的吗 那本书会说double有效位数6位? 把那书少了把 至少贡献光和热
lin5161678 2019-03-13
  • 打赏
  • 举报
回复
引用
本来long应该可以放19位数的。
毫无根据毫无理由的本来 本呢?
lin5161678 2019-03-13
  • 打赏
  • 举报
回复
引用
第四个存储单元或许有以前程序使用过的垃圾
那么 这个垃圾为什么不能是 '\0' 呢?
棉猴 2019-03-13
  • 打赏
  • 举报
回复


这是VS2015运行的结果,b[3]的值是0xcd,而b[3]b[4]两个值合起来0xcd45正好表示一个汉字
秋的红果实 2019-03-12
  • 打赏
  • 举报
回复
补充下,在问题1里面,VS下执行cout<<b<<endl;输出末尾有乱码,codeblocks没有

64,654

社区成员

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

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