-3
int main(void) {

      int i = 0;
      scanf("%f", &i);

      return 0;
}

据称,如果我输入一个浮点数,它将崩溃。

我在 Gcc4.7 中对其进行了测试,它可以工作。我没有VC6.0,所以我想知道它是否会在VC6.0中崩溃。

如果会,为什么?有人告诉我是因为 FPU 没有初始化?

4

3 回答 3

2
  int i = 0;
  scanf("%f", &i);

你要:

  scanf("%d", &i);

反而。

%finscanf需要一个指针类型的参数float。传递指针类型的参数int是未定义的行为。

于 2012-12-21T08:55:15.343 回答
2

此代码导致未定义的行为
如果它有效,你是(不)幸运的。它不能保证工作。它可能会失败或工作。

您有责任确保格式说明符与传入的实际类型相printf匹配scanf. 由于实际类型i正确int的格式说明符应该是%d.

  scanf("%d", &i);
于 2012-12-21T08:56:10.003 回答
1

我认为这是指旧版本的 microsoft(和 borland,可能还有其他)编译器,除非编译器检测到您正在使用浮点(或使用一些特殊的编译器选项来强制它),否则代码中没有浮点函数。这是一个毫无意义的例子,因为这段代码绝对不可能以合理的方式工作。如果您真的想将浮点值填充到整数中,则使用类型双关指针强制转换或联合是“批准”的方式。

这些天并不真正相关,因为对通用函数(例如 *printf 和 *scanf)的浮点支持通常在主标准库中提供,并且正确编写的代码不会有任何问题。

我相信如果您要在 printf 中使用 %f(或 %g),同样的问题也适用。

于 2012-12-21T09:30:57.790 回答