忘川之畔 发表于 2018-1-30 11:45:27

定义一个整形变量,在输入时输入一个字符,然后输出,为什么不是ASCLL码值?

例如
#include<iostream>
using namespace std;
int main(void)
{
        int x;
        cin>>x;
        cout<<x;
        return 0;
}
//我用的VS2017返回值好像是地址值.

orino 发表于 2018-1-30 11:47:23

字符要定义char,不是int

忘川之畔 发表于 2018-1-30 11:49:21

orino 发表于 2018-1-30 11:47
字符要定义char,不是int

这个我知道,但是这样的输入的话,难道不是输入那个字符的ASCCL码值吗?

orino 发表于 2018-1-30 11:52:35

忘川之畔 发表于 2018-1-30 11:49
这个我知道,但是这样的输入的话,难道不是输入那个字符的ASCCL码值吗?

不是,类型不同,你输入会造成异常,因为cin会自动以整数的方式去读取字符,肯定有输入异常,或者你输入的时候格式化输入,不然无法直接正常输入

BngThea 发表于 2018-1-30 11:54:23

你可以这样
char x;
cin>>x;
cout<<int(x);

orino 发表于 2018-1-30 11:55:19

还有这个和编译器有关,在codeblocks上,不管输入哪个字符,都直接为0

忘川之畔 发表于 2018-1-30 11:58:22

orino 发表于 2018-1-30 11:55
还有这个和编译器有关,在codeblocks上,不管输入哪个字符,都直接为0

恩恩,VS中是-858993460

忘川之畔 发表于 2018-1-30 11:58:52

BngThea 发表于 2018-1-30 11:54
你可以这样

结果还是默认值-858993460

忘川之畔 发表于 2018-1-30 11:59:34

orino 发表于 2018-1-30 11:52
不是,类型不同,你输入会造成异常,因为cin会自动以整数的方式去读取字符,肯定有输入异常,或者你输入 ...

格式化输入好像也不行..,也是VS中整型变量的默认值

orino 发表于 2018-1-30 12:19:16

给你慢慢分析吧, 理论上是这样的,在VS中变量初始化是用0xCC这样的16进制值来处理的,所以int x被初始化为了0xCCCCCCCC,也就是-858993460,然后输入字符的时候,无视那个字符,所以x还是-858993460,codeblocks是默认为0所以值是0.
至于真的想输入格式化,例如scanf('%c', &x), 例如我以 a 也就是0x61举例,实际上是写到x变量的最后一个字节,总共4个字节前三个都是cc,也就是0xcccccc61,你用cout的时候直接全部输出当然还是错的,只取最后一个字节才行。反正cin和cout不适合折腾
给个例子
#include<iostream>
using namespace std;
int main(void)
{
        int x;
        //cin >> x;
        scanf("%c", &x);
        cout << (x&0xFF);
        return 0;
}

忘川之畔 发表于 2018-1-30 12:24:08

orino 发表于 2018-1-30 12:19
给你慢慢分析吧, 理论上是这样的,在VS中变量初始化是用0xCC这样的16进制值来处理的,所以int x被初始化为 ...

有点懂了,谢谢了!
页: [1]
查看完整版本: 定义一个整形变量,在输入时输入一个字符,然后输出,为什么不是ASCLL码值?