-4

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

对于代码:

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?

4

3 回答 3

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,但我把这些消息去掉了,因为它们与你的问题没有严格的关系。

于 2012-07-15T18:02:17.527 回答
1

输出是0.000000,怎么不是7.500000?

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

为什么它不进行错误编译?

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

于 2012-07-15T18:02:15.437 回答
1
  1. 在第一种情况下,您尝试打印 , 的值i以获取7.5您需要打印的值f

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

更多关于 2。

要打印一个float值,它需要与%f格式说明符配对。对于integer 值,这应该是%d。这些是倒退的,这就是为什么您会因为这种不匹配而看到未定义的行为/输出。

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

旁白

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

于 2012-07-15T18:02:25.777 回答