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