【问题标题】:Why the result are so strange [closed]为什么结果如此奇怪[关闭]
【发布时间】:2021-05-28 02:46:18
【问题描述】:
int main( )
{
   int x = 5;
   float y = 3.1f;
   printf("int x=%d   ,float x=%f    ,y=%f,    y=%d\n", x, x, y, y);  //X86
   return 0;
}

我认为答案是 5 、 5.0 、 3.1 、 3。 但答案是 enter image description here

为什么?

【问题讨论】:

  • 请在您的问题中以文本形式包含输出,格式化为代码,而不是作为指向另一个站点上的图像的链接。而你忘记了所需的#include <stdio.h>
  • 要获得所需的输出,您需要强制转换为相应格式说明符所期望的类型:printf("int x=%d, float x=%f, y=%f, y=%d\n", x, (double)x, y, (int)y); 注意第四个参数 (y) 将 float 提升为 double是自动的。

标签: c cdecl


【解决方案1】:

%d 格式说明符需要int 类型的参数,而%f 需要double 类型的参数(可能从float 提升)。如果您传递了错误类型的参数,则行为未定义。

解决方案:不要那样做。

(最可能的行为是包含int 值的内存或寄存器将显示就好像它是double 类型,但任何事情都可能发生。)

对于大多数函数调用,将int 传递给期望double 参数的函数会导致值被转换,因此42 变为42.0。但是由于printfvariadic,所以预期的类型是由格式字符串决定的,而不是参数类型,所以编译器一般不能知道生成类型转换。

【讨论】:

猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2013-08-27
  • 2018-10-30
相关资源
最近更新 更多