隐式和显式铸造

时间:2015-10-19 15:09:26

标签: c casting

使用:

float return1(void);

int  main()
{ 
      int    x;
      x   =   (float)return1();
      printf("%f",x);
      return 0;
}

float return1()
{
       return 1;
}`

为什么输出-0.000000

不应该x隐式转换为float并打印1.000000吗?

5 个答案:

答案 0 :(得分:3)

  

不应该将x隐式地转换为浮点数并打印1.000000?

不,它不应该因为编译器可能不知道printf做什么或将使用哪种格式来打印x

x的类型为int,因此应使用%d代替%f进行打印。

答案 1 :(得分:2)

为什么输出-0.000000?

因为

    printf("%f",x);

和x是int,如果你想要1.00:,那么

    printf("%f", (double) x);

或更好地将其更改为:

    printf("%i", x);

答案 2 :(得分:2)

printf不会根据格式字符串(当前%f)中给出的标记来转换和解释对象。

取决于你想要什么

printf("%d", x);

printf("%f", (float)x);

或在C ++中:

std::cout << x; // or float(x)

答案 3 :(得分:1)

无需将return1()投射到float;您的x是整数,并且您希望将其格式化为float中的printf

float return1(void);

int main(void)
{
    int x;

    x = return1();
    printf("%d", x);
    return 0;
}

float return1()
{
    return 1;
}

答案 4 :(得分:0)

不,它不应该。编译器通常不检查格式字符串和您提供的参数之间的对应关系。在你的情况下,它将能够这样做,但如果有人将字符串变量作为格式字符串传递怎么办?这就是大多数编译器没有检查通信的原因。