【问题标题】:How this code is working actually? [closed]这段代码实际上是如何工作的? [关闭]
【发布时间】:2013-10-13 12:31:42
【问题描述】:
int main()
 {
  float a=4;
  int b=2;
  printf("%d\n",(a/b));
  printf("%f",(a/b));
  return 0;
 }

第一个 printf 语句再次打印不同的不同值。我知道这是因为我将 %d 说明符用于浮点类型数。但我不知道实际工作。 还, 当我更改第一行时:

int a=4;

那么第二个语句正在打印

0.000000

一次又一次。那么为什么第一个代码中的第一个 printf 打印不同的值,但在第二个代码的第二个语句中,它打印相同的值? 谁能解释一下?

【问题讨论】:

  • 你能粘贴输出吗?
  • 使用 %d 打印浮点数会调用未定义的行为。所以无论程序效果如何,都是正确的。

标签: c


【解决方案1】:

将int 除以int 得到int。将float 除以int 得到float。

对于int,使用%d。对于float,请使用%f。如果你把它们混在一起,你就会变成垃圾。

【讨论】:

  • 我已经知道了。我想知道的是为什么它给垃圾。浮点数如何存储在内存中。当我们使用说明符 %d 时,它是如何将其解释为整数的。你能告诉我说明符是如何工作的吗?
  • 你正在做的事情是未定义的,这意味着它取决于实现特定的细节,并且可以做任何事情(包括崩溃和更糟)。如果您想了解详细信息,请使用调试器逐位打印内存,查看整数如何存储以及浮点数如何存储,并查看将浮点数视为整数时会得到什么。
【解决方案2】:

a/b 会给你一个float(并被提升为double)值。使用 %d 说明符打印它会调用未定义的行为。

那为什么第一个代码中的第一个printf 打印不同的值,但在第二个代码的第二个语句中,它打印相同的值?谁能解释我?

这是因为未定义的行为。在这种情况下,有时您可能会得到您期望的结果,有时结果是我所期望的,有时是编译器所期望的。

【讨论】:

  • a/b 是一个float,但它被提升为double。 +1 无论如何都要提到 UB。
  • 跨环境未定义。可能是 OP 询问为什么这在同一环境中不一致。可能是他的环境中的这段代码访问了未初始化的内存区域,因此在每次通过时都会给出不同的结果?但是,结果在我的系统中的不同通道上是一致的(强调 UB)。
猜你喜欢
  • 2012-08-02
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2012-09-29
  • 2011-05-16
相关资源
最近更新 更多