鱼C论坛

 找回密码
 立即注册
查看: 2978|回复: 10

[已解决]关于C语言里定义的变量类型和输入类型不匹配的问题

[复制链接]
发表于 2020-8-24 18:03:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在学习小甲鱼C语言的视频里,第一节最后给了一段比较两个数大小的程序,我在自己练习的时候,把 x,y,z的类型误写成了double,程序如下:
#include <stdio.h>
#include <math.h>
int max(int a,int b);/*函数说明*/
void main()
{
double x,y,z;
int max(int a,int b);
printf("Input two numbers:\n");
scanf("%d%d",&x,&y);
z=max(x,y);
printf("%d %d Maximum=%d",x,y,z);
}

int max(int a,int b)
{
    
    if (a>b)
        return a;
    else
        return b;

}
然后我输入两个数3和7,打印出来的 结果是 3 7 Maximum=0,虽然这个程序存在变量的类型和输入的数据类型不匹配的问题,但我想请教一下为什么会造成max返回值是0?
接着我又输入了3.5 7.8,打印出来的结果是3 41 Maximum=0,这里为什么x,y的值变成了3和41呢?这个41从哪来的??
还请各位高手能答疑解惑,感谢
最佳答案
2020-8-24 19:04:36
这里面涉及到两个问题
1、scanf读取问题。
里面写的是两个%d,但是你输入的是3.5,这样scanf读取的时候第一个变量读取到了3,第二个变量读取的时候遇到了'.',没有读到int类型数据, 然后就没有给y赋值,y值是不固定的,看运气,程序分配给y的那个单元原来是什么就会输出什么

2、不同类型存储问题
double类型变量占8个字节,int类型变量占4个字节(与系统位数有关)。所以double类型数据已int输出的时候实际上输出的是元数据的一部分内容
具体输出什么,怎么输出,可以看看这个帖子,讲了各个类型数据的存储
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 18:51:28 | 显示全部楼层
#include <stdio.h>
int main(void)
{
                double a, b;
                scanf("%d",&a);
                printf("a = %d\n",a);
                
                scanf("%lf",&b);
                printf("b = %d\n",b);
                
                return 0;
}

3
a = 3
4
b = 0

3.4
a = 3
b = -1717986918
可以参考上面代码,自己输几次
明明是double型,非要以%d输出,结果就是0
至于那个41,我认为是随机数,当你以3.4输入,b的值会自动输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 18:53:44 | 显示全部楼层
巴巴鲁 发表于 2020-8-24 18:51
可以参考上面代码,自己输几次
明明是double型,非要以%d输出,结果就是0
至于那个41,我认为是随机数, ...

以上纯属个人见解,不过你知道这是错的就不要这样写了,编程嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 18:55:29 | 显示全部楼层
你这20行代码,14个warning,而且我测试结果溢出了,还跟你的不一样,说实在的,scanf是真的迷(我学c++的)

                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 19:04:36 | 显示全部楼层    本楼为最佳答案   
这里面涉及到两个问题
1、scanf读取问题。
里面写的是两个%d,但是你输入的是3.5,这样scanf读取的时候第一个变量读取到了3,第二个变量读取的时候遇到了'.',没有读到int类型数据, 然后就没有给y赋值,y值是不固定的,看运气,程序分配给y的那个单元原来是什么就会输出什么

2、不同类型存储问题
double类型变量占8个字节,int类型变量占4个字节(与系统位数有关)。所以double类型数据已int输出的时候实际上输出的是元数据的一部分内容
具体输出什么,怎么输出,可以看看这个帖子,讲了各个类型数据的存储
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2020-8-24 21:20:16 | 显示全部楼层
巴巴鲁 发表于 2020-8-24 18:53
以上纯属个人见解,不过你知道这是错的就不要这样写了,编程嘛

感谢回答。我是感觉这个报错可能和C的一些原理有关,弄清楚一些以后出类似的错也好排查一些,所以来问问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 21:21:11 | 显示全部楼层
昨非 发表于 2020-8-24 18:55
你这20行代码,14个warning,而且我测试结果溢出了,还跟你的不一样,说实在的,scanf是真的迷(我学c++的 ...

如果变量的类型正确warning就基本没了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 21:32:27 | 显示全部楼层
本帖最后由 RichardMin 于 2020-8-24 21:52 编辑
sunrise085 发表于 2020-8-24 19:04
这里面涉及到两个问题
1、scanf读取问题。
里面写的是两个%d,但是你输入的是3.5,这样scanf读取的时候第 ...


感谢大佬回复。对于您回答的第二点,我又想到两个问题,一个是如果我计算机或者编译器重启,输入相同的数,由于给scanf给分配的随机内存变了,那么变量的值和上一次的就不一样了是么?还有一个就是int类型的数据如果以float或者double类型输出会是怎么样的呢?看了一下您给的链接,我有点不明白的就是您给的程序里面,b,c,d好像都没有赋值,最后输出的是系统分配的随机数么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 13:46:09 | 显示全部楼层
RichardMin 发表于 2020-8-24 21:32
感谢大佬回复。对于您回答的第二点,我又想到两个问题,一个是如果我计算机或者编译器重启,输入相同的 ...
一个是如果我计算机或者编译器重启,输入相同的数,由于给scanf给分配的随机内存变了,那么变量的值和上一次的就不一样了是么?还有一个就是int类型的数据如果以float或者double类型输出会是怎么样的呢?

变量的内存是在定义的时候分配的,scanf只是给变量赋值,若没有赋值直接输出,那个输出的是该内存单元原来的值。举个例子,村里有很多地(内存空间),今年把一块地分给了张三(定义了变量),他今年种什么就会收获什么(赋值是什么就会输出什么),若他什么都没种(没有赋值),地里也不是什么都不长,原来肯定有人在这里种过东西(以前有其他程序用过这个内存单元),但是不知道种的什么。所以也就不知道能收获什么(输出什么值)。

看了一下您给的链接,我有点不明白的就是您给的程序里面,b,c,d好像都没有赋值,最后输出的是系统分配的随机数么?

这个是联合体,几个变量共用同一单元,给一个变量赋值,其他变量就也有值了。这个你之后会学到,这个程序就是让你看看浮点数的存储
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-25 15:37:08 | 显示全部楼层
sunrise085 发表于 2020-8-25 13:46
变量的内存是在定义的时候分配的,scanf只是给变量赋值,若没有赋值直接输出,那个输出的是该内存单元 ...

大概有些明白了。最后我这里还有一个问题我在一楼列举的输入得到的Maximum,也就是z的值都是0.由于我的输入都是设置为整形,占4个字节,但是变量是按照double类型存储的,那么多出来的4个字节应该是需要高位补0?然后函数的输入变量是4个字节的整形,那么就应该读取x,y的低4位,但是低四位不是刚好还是我想要输入的数字3和7的补码,我感觉按照这个逻辑z的值应该是正确等于x,y的最大值的,不过结果却是0,想最后请教您我这个思路哪里出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 18:09:57 | 显示全部楼层
RichardMin 发表于 2020-8-25 15:37
大概有些明白了。最后我这里还有一个问题我在一楼列举的输入得到的Maximum,也就是z的值都是0. ...



仔细看看我写的那个数据存储的帖子!
int存储和float存储完全不一样,不是你所想象的高位空缺补零那么简单。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表