c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值相关的知识,希望对你有一定的参考价值。

DEBUG版本为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xcc(一个字节),也就是说局部变量如果不初始化,会被自动初始化为0xCCCCCCCC,对应十进制为0xCCCCCCCC,而不是就让它随机设置。
因为DEBUG这个机制是为了方便我们调试程序的,在程序出现问题可以捕捉这个异常。
我们也要知道,Debug为了调试方便,为了达到EditAnd Continue特性,为每个函数都多分配了64个字节。当用户在调试时在代码里增加少量变量的时候,编译器就可以分配那64个字节的空间过去,这样就不用重新编译程序来重新调试。(Debug模式下)
Eg:int:-858993460
十六进制:OXCCCCCCCC
二进制:11001100110011001100110011001100
一般会在一下两种情况下被赋予这种默认值:
(1)当一个未初始化赋值的时候(VC下如此,其他不保证)默认是0xCCCCCCCC;,他在内存就默认保存为-858993460即二进制的11001100 11001100 1100110011001100;十六进制的CCCCCCCC;而汉字"烫"的编码恰好就是1100110011001100:
(2)如果变量的数据类型由于你的运算的溢出了,在内存中系统就自动改为-858993460
Eg:
unsigned long:3435973836(OXCCCCCCCC)(11001100110011001100110011001100)
short:-13108(0XCCCC)(1100110011001100)
char:-52 '?'其中-52为(0XCC)(11001100)
double,long double:-9.2559631349317831e+061
bool:true
可能有人会问,为什么非要初始化成这个值呢?
如果野指针的初值不确定,那么每次调试同一个程序就可能出现不一样的结果,比如这次程序崩掉,下次正常运行,再一次虽然没崩掉,但结果不对……那显然对我们解bug是非常不利的。
设计成0xcccccccc是有特殊用意的,在判断指针的时候会用到。
对于一个未初始化的指针,如果去取值的话会出错。那么怎么判断指针有没有被初始化呢?肯定有人问为什么不设置成0x00000000,把它当成指针为初始化的状态?因为0x00000000空指针是指针的有效状态(并不是未初始化状态)。所以如果用0x00000000当成为初始化状态的话,可能会误导人,人们可能会误认为空指针就是未初始化状态。
为什么不设置成别的值呢,偏偏是0xcccccccc?
因为其他的值也都是有效的指针。而0xCCCCCCCC在Windows下永远不可能是一个指针的有效状态(不是NULL,不指向一个对象,不指向一堆对象紧接之后的区域),这就是在模拟野指针。
参考技术A cin>>a需要的是一个所有字符都是0123456789之一的字符序列,如果输入的不是这样,就根本不会给a赋值,并且cin流会变成错误状态…… 参考技术B 因为你给a赋值为int型,输入c是错误的,只能输入整型。 参考技术C cin>>a表示要从输入流中读取一个整形数值,所以当你输入字符‘c’时,输入流并不会把‘c’值存入变量a中,而是直接返回了,所以这个时候变量a还是处于未初始化状态,所以输出的是你看到的数值。如果你输入“234a",则输出会是234;如果输入为字符开头,则输出时一个随机数。 参考技术D 这应该是一个随机数

C++ 关于cin输入

#include<iostream>
int main()

using namespace std;
int a;
cin>>a;
cout<<a<<endl;
return 0;


这段程序 如果我输入
a
程序会输出什么?

//注意着两张图片,第二张 我把cin一行注释起来了,

由于类型不同,int a并没有储存你输入的a的adcll码,

参考技术A 我来详细地给楼主解释一下这个程序的执行过程吧
cin读的是输入缓冲区(stdin)中的内容,只有缓冲区为空的时候才会要求用户输入,否则只是读取缓冲区的内容。
在第一次运行cin>>s的时候,
缓冲区为空,所以会显示下划线让你输入,线程挂起,然后你输入sdf sdf ssf sdf f EOF 回车
这时候,cin>>s返回,第一个sdf读进s,然后便输出sdf和换行
下一次执行cin>>s的时候,缓冲区不为空,所以不再要求用户输入,读取第二个sdf,然后输出sdf换行,依次类推
直到cin读到eof的时候,cin>>s返回false,循环退出,程序结束
参考技术B 会输出一个不确定的值,该值是系统为变量a分配的地址上原有的数据值(会随时间发生改变)。 参考技术C 应该是ASCII的a,97吧

以上是关于c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值的主要内容,如果未能解决你的问题,请参考以下文章

c++ 中直接输入char型数据只能是个位数字 例如 char a,b,c; cin>>a>>b>>c;

C++ 关于cin输入

c++里!cin是啥意思

在发布版本中使用英特尔 c++ 编译时出现“cin >> a >> b”编译错误

c++ 程序

C++获取字符cin,getchar,get,getline的区别