int main(void) {
int i = 0;
scanf("%f", &i);
return 0;
}
据称,如果我输入一个浮点数,它将崩溃。
我在 Gcc4.7 中对其进行了测试,它可以工作。我没有VC6.0,所以我想知道它是否会在VC6.0中崩溃。
如果会,为什么?有人告诉我是因为 FPU 没有初始化?
int main(void) {
int i = 0;
scanf("%f", &i);
return 0;
}
据称,如果我输入一个浮点数,它将崩溃。
我在 Gcc4.7 中对其进行了测试,它可以工作。我没有VC6.0,所以我想知道它是否会在VC6.0中崩溃。
如果会,为什么?有人告诉我是因为 FPU 没有初始化?
int i = 0;
scanf("%f", &i);
你要:
scanf("%d", &i);
反而。
%f
inscanf
需要一个指针类型的参数float
。传递指针类型的参数int
是未定义的行为。
此代码导致未定义的行为。
如果它有效,你是(不)幸运的。它不能保证工作。它可能会失败或工作。
您有责任确保格式说明符与传入的实际类型相printf
匹配scanf
. 由于实际类型是i
正确int
的格式说明符应该是%d
.
scanf("%d", &i);
我认为这是指旧版本的 microsoft(和 borland,可能还有其他)编译器,除非编译器检测到您正在使用浮点(或使用一些特殊的编译器选项来强制它),否则代码中没有浮点函数。这是一个毫无意义的例子,因为这段代码绝对不可能以合理的方式工作。如果您真的想将浮点值填充到整数中,则使用类型双关指针强制转换或联合是“批准”的方式。
这些天并不真正相关,因为对通用函数(例如 *printf 和 *scanf)的浮点支持通常在主标准库中提供,并且正确编写的代码不会有任何问题。
我相信如果您要在 printf 中使用 %f(或 %g),同样的问题也适用。