C中的浮点输出/输入问题

时间:2012-07-15 18:00:31

标签: c floating-point

我希望您帮助理解以下内容:

代码:

int main() {
    int i=23;
    float f=7.5;

    printf("%f", i);
    return 1;
}

输出为0.000000,为什么不是7.500000

代码

int main() {
    int i=23;
    float f=7.5;

    printf("%d\n",f);
    printf("%f",i);
    return 1;
}

输出为1455115000, 7.500000。为什么不编译错误?这个号码是1455115000是什么?为什么现在正在印刷7.500000?

3 个答案:

答案 0 :(得分:8)

printf调用中格式/参数不匹配会导致未定义的行为。如果您调高警告级别,编译器可能会告诉您。例如,clang会为您的第一个程序发出此警告:

example.c:5:10: warning: conversion specifies type 'double' but the argument has
      type 'int' [-Wformat]
printf("%f", i);
        ~^   ~
        %d

这些是你的第二个:

example.c:5:10: warning: conversion specifies type 'int' but the argument has
      type 'double' [-Wformat]
printf("%d\n",f);
        ~^    ~
        %f
example.c:6:10: warning: conversion specifies type 'double' but the argument has
      type 'int' [-Wformat]
printf("%f",i);
        ~^  ~
        %d

这根本没有特别的标志。 gcc默认警告您的程序。例1:

example.c:5: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

示例2:

example.c:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
example.c:6: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

这两个编译器也警告你隐含声明printf,但是我将这些消息留下了,因为它们与你的问题并不严格相关。

答案 1 :(得分:1)

  

输出是0.000000,怎么不是7.500000?

因为%f告诉printf期待float,但i不是float。所以你要调用未定义的行为

  

为什么不编译错误?

在GCC(可能还有其他编译器)中,你会收到一条警告信息。

答案 2 :(得分:1)

  1. 在第一种情况下,您尝试打印i的值,以获取。{ 值7.5您需要打印f

  2. 在第二种情况下,问题是格式为不匹配 说明符和提供给printf()

  3. 的参数

    更多关于2。

    要打印float值,需要将其与%f格式说明符配对。对于int eger值,这应为%d。这些是向后的,这就是为什么由于这种不匹配而看到未定义的行为/输出的原因。

    如果编译具有最高警告级别的程序,则可能会收到有关这些类型的不匹配/错误的警告。

    除了

    通常,返回值0表示程序终止成功。 非零值(如1)表示存在问题。可能与您的计划无关,但您可能需要记住这些内容。