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,不指向一个对象,不指向一堆对象紧接之后的区域),这就是在模拟野指针。
因为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,不指向一个对象,不指向一堆对象紧接之后的区域),这就是在模拟野指针。
展开全部
cin>>a需要的是一个所有字符都是0123456789之一的字符序列,如果输入的不是这样,就根本不会给a赋值,并且cin流会变成错误状态……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-05-04
展开全部
因为你给a赋值为int型,输入c是错误的,只能输入整型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
cin>>a表示要从输入流中读取一个整形数值,所以当你输入字符‘c’时,输入流并不会把‘c’值存入变量a中,而是直接返回了,所以这个时候变量a还是处于未初始化状态,所以输出的是你看到的数值。如果你输入“234a",则输出会是234;如果输入为字符开头,则输出时一个随机数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这应该是一个随机数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询