未被驯化的甲鱼 发表于 2022-10-16 20:49:23

同学们!为什么我int变量赋值给float,打印出来是这样?

输入 1
结果是 x=0.00,y=1.00

我知道输入类型
scanf("%d",&x);
应该改成scanf("%f",&x);
就不会有问题了

但我想知道现在这个结果是 x=0.00,y=1.00怎么来的?
y=x*x+1 运行难道不是 1*1+1等于整型的2吗?
然后赋值给浮点型变量y,y等于2.0,再输出保留两位小数,y等于2.00,为什么不是这样?

代码如下
#include <stdio.h>
int main(){
        float x,y;
        scanf("%d",&x);
        if(-5<x && x<0){
                printf("x=%.2f,y=%.2f",x,y=-x+4);
        }
        //===================================================
        else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",x,y=x*x+1);//这行!这行!
        }
        //===================================================
        else if(x == 0){
                printf("x=%.2f,y=0.00",x);
        }
        else{
                printf("No meaning");
        }
        return 0;
}

tommyyu 发表于 2022-10-16 20:53:03

本帖最后由 tommyyu 于 2022-10-16 20:56 编辑

不能用%d输入,否则x就是0,y = 0*0+1 = 1

jackz007 发表于 2022-10-16 21:08:02

      scanf("%f" , & x) ; // scanf() 的格式描述符与变量之间必须对号入座,浮点型变量应该用 "%f" 而不是 "%d"

FengYue20 发表于 2022-10-16 22:27:33

"不要用%d,不要用%d,不要用%d",重要的事情说三遍
解释一下:你用%d输入x,错误,但是C语言不会报异常,所以x会得到一个值,因为float类型本身就会丢失精度,所以这个值近似与0,所以执行else if(0<x && x<5)这个条件,然后x=0.0,y=1.00
(个人理解)

jhq999 发表于 2022-10-17 15:04:29

{:5_109:}
#include <stdio.h>
int main(){
      float x,y;
      scanf("%d",&x);
      if(-5<*(int*)&x && *(int*)&x<0){
                printf("x=%.2f,y=%.2f",(float)(*(int*)&x),y=-(float)(*(int*)&x)+4);
      }
      //===================================================
      else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",(float)(*(int*)&x),y=(float)(*(int*)&x)*(float)(*(int*)&x)+1);//这行!这行!
      }
      //===================================================
      else if(x == 0){
                printf("x=%.2f,y=0.00",(float)(*(int*)&x));
      }
      else{
                printf("No meaning");
      }
      return 0;
}

未被驯化的甲鱼 发表于 2022-10-17 16:00:40

jhq999 发表于 2022-10-17 15:04


兄弟辛苦了,帮我加了那么多强制转换{:5_106:}

未被驯化的甲鱼 发表于 2022-10-17 16:03:04

FengYue20 发表于 2022-10-16 22:27
"不要用%d,不要用%d,不要用%d",重要的事情说三遍
解释一下:你用%d输入x,错误,但是C语言不会报异常, ...

这个丢失精度能详细讲讲吗?为什么这个值会近似于0?丢那么多的吗?

我是扬帆起航 发表于 2022-10-17 17:03:14

转换符要和你声明的变量类型一致

jhq999 发表于 2022-10-17 17:47:39

未被驯化的甲鱼 发表于 2022-10-17 16:00
兄弟辛苦了,帮我加了那么多强制转换

{:5_109:}

qsva 发表于 2022-10-17 22:26:50

#include <stdio.h>
int main(){
      float x,y;    //这为float类型的对应是%f ,用%d当然会有问题了
      scanf("%d",&x);//用%d来输出准确来说是有值的但是由于格式符不对输入的是乱码,应该会被判断有值
                                 //所以会执行第二if语句
      if(-5<x && x<0){
                printf("x=%.2f,y=%.2f",x,y=-x+4);
      }
      //===================================================
      else if(0<x && x<5){
                printf("x=%.2f,y=%.2f",x,y=x*x+1);//这行!这行!
      }
      //===================================================
      else if(x == 0){
                printf("x=%.2f,y=0.00",x);
      }
      else{
                printf("No meaning");
      }
      return 0;
}
页: [1]
查看完整版本: 同学们!为什么我int变量赋值给float,打印出来是这样?