RichardMin 发表于 2020-8-24 18:03:23

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

在学习小甲鱼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从哪来的??
还请各位高手能答疑解惑,感谢{:10_297:}

巴巴鲁 发表于 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的值会自动输出

巴巴鲁 发表于 2020-8-24 18:53:44

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

以上纯属个人见解,不过你知道这是错的就不要这样写了,编程嘛

昨非 发表于 2020-8-24 18:55:29

你这20行代码,14个warning,而且我测试结果溢出了,还跟你的不一样,说实在的,scanf是真的迷(我学c++的)
https://s1.ax1x.com/2020/08/24/dsFKk6.png

sunrise085 发表于 2020-8-24 19:04:36

这里面涉及到两个问题
1、scanf读取问题。
里面写的是两个%d,但是你输入的是3.5,这样scanf读取的时候第一个变量读取到了3,第二个变量读取的时候遇到了'.',没有读到int类型数据, 然后就没有给y赋值,y值是不固定的,看运气,程序分配给y的那个单元原来是什么就会输出什么

2、不同类型存储问题
double类型变量占8个字节,int类型变量占4个字节(与系统位数有关)。所以double类型数据已int输出的时候实际上输出的是元数据的一部分内容
具体输出什么,怎么输出,可以看看这个帖子,讲了各个类型数据的存储

RichardMin 发表于 2020-8-24 21:20:16

巴巴鲁 发表于 2020-8-24 18:53
以上纯属个人见解,不过你知道这是错的就不要这样写了,编程嘛

感谢回答。我是感觉这个报错可能和C的一些原理有关,弄清楚一些以后出类似的错也好排查一些,所以来问问{:10_254:}

RichardMin 发表于 2020-8-24 21:21:11

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

如果变量的类型正确warning就基本没了

RichardMin 发表于 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好像都没有赋值,最后输出的是系统分配的随机数么?

sunrise085 发表于 2020-8-25 13:46:09

RichardMin 发表于 2020-8-24 21:32
感谢大佬回复。对于您回答的第二点,我又想到两个问题,一个是如果我计算机或者编译器重启,输入相同的 ...

一个是如果我计算机或者编译器重启,输入相同的数,由于给scanf给分配的随机内存变了,那么变量的值和上一次的就不一样了是么?还有一个就是int类型的数据如果以float或者double类型输出会是怎么样的呢?
变量的内存是在定义的时候分配的,scanf只是给变量赋值,若没有赋值直接输出,那个输出的是该内存单元原来的值。举个例子,村里有很多地(内存空间),今年把一块地分给了张三(定义了变量),他今年种什么就会收获什么(赋值是什么就会输出什么),若他什么都没种(没有赋值),地里也不是什么都不长,原来肯定有人在这里种过东西(以前有其他程序用过这个内存单元),但是不知道种的什么。所以也就不知道能收获什么(输出什么值)。

看了一下您给的链接,我有点不明白的就是您给的程序里面,b,c,d好像都没有赋值,最后输出的是系统分配的随机数么?
这个是联合体,几个变量共用同一单元,给一个变量赋值,其他变量就也有值了。这个你之后会学到,这个程序就是让你看看浮点数的存储

RichardMin 发表于 2020-8-25 15:37:08

sunrise085 发表于 2020-8-25 13:46
变量的内存是在定义的时候分配的,scanf只是给变量赋值,若没有赋值直接输出,那个输出的是该内存单元 ...

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

sunrise085 发表于 2020-8-25 18:09:57

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

{:5_104:}

仔细看看我写的那个数据存储的帖子!
int存储和float存储完全不一样,不是你所想象的高位空缺补零那么简单。
页: [1]
查看完整版本: 关于C语言里定义的变量类型和输入类型不匹配的问题