1
#include <stdio.h>

 int main(int argc, const char * argv[])
 {

    float apples = 1.1;

    float bananas = 2.2;

    double fruit = apples + bananas;

    printf("%f.\n",fruit);

    return 0;

 }

好吧....那么为什么需要 %f 呢?我知道它正在为我打印“水果”的十进制表示法,但为什么我不能只要求程序打印数字“水果”?是因为我必须声明我是否希望以十进制 %f 或科学记数法 %e 打印“水果”?我有时也遇到过 %d。这意味着什么?

4

7 回答 7

2

好吧,如果你看一下printf 函数的定义,那么你就会知道这些值是作为 %d 传递的:int 格式说明符 %f:float 格式说明符

被称为格式说明符

printf 也是库中定义的一个简单方法,根据参数打印值

例如

int a = 5;
float b = 5.43 ;

现在如果你写

printf("%d",a);

它打印存储在变量 a ==>> 中的整数值,即 5

printf("%f",b);

它打印存储在变量 b ==>> 中的浮点值,即 5.430000 // 最多六位数

如果您尝试使用代码

printf("%f",a);
printf("%d",b);

这两行都打印了称为垃圾值的尴尬值,因为您使用了错误的格式说明符,因此从未知位置获取

你可以参考链接

1 : http://www.elook.org/programming/c/printf.html获取格式说明符列表

至 Alok Save :

看到这有点复杂,如果我无法解释清楚,请告诉我,我将尝试创建一个具有更好答案的差异问题。

实际发生的是当你写

int a = 5 // 101 in binary

然后在内存中分配 2 个字节 = 16 位,例如


0000000000000101

但是当您尝试通过将 %f 作为格式说明符将其打印为浮点数时,它会要求 4 字节 = 32 位表达式,但您得到的是 16 位表示,最重要的一点是浮点数的第 16 位保留用于 ' 。那是十进制,所以你的


0000000000000101 变为


  1. = 二进制的 10 // 十进制的 2

因此小数点前的值变为 2 而不是 5,并且由于浮点数仍然有 16 位表示小数点后的值,而 int 变量仅提供 16 位来表示小数点前的值,因此表示小数点后值的最后 16 位选择垃圾values 这些垃圾值代表一些随机二进制值最终会产生一些值

所以你的输出永远是 2.something

这部分对于每台机器都会有所不同,因为它会选择垃圾值,但在给出的解释之后,小数点前的值总是相同的

我希望这服务

但如果它不让我知道

我会努力想出一个更好的代表

链接也将非常有帮助

于 2013-01-23T15:03:49.013 回答
1

printf函数的原型是

int printf(const char * restrict format, ...);

第一个参数始终是描述输出格式的文本字符串(因此你不能只写printf(fruit);)。...表示可以在格式字符串之后使用printf零个或多个附加参数(这称为可变参数函数)。

不幸的是,可变参数函数不会自动知道在参数列表的可变部分中传递给它们的参数的数量或类型。他们只是在最后一个固定参数之后看到下一个可用参数的起始地址。您必须以某种方式将该信息作为固定参数的一部分传递。使用printf,附加参数的数量和类型由格式字符串中的转换说明符指示。所以当你写

printf("%f\n", fruit);

转换说明符%f告诉格式字符串后面printf还有一个类型的附加参数。double转换说明符还告诉printf如何格式化值以进行显示。例如,在

printf("%7.2f\n", fruit);

转换说明符%7.2f告诉printf将值显示为 7 个字符宽的字段,小数点后有 2 位数字,或9999.99.

如果参数的类型与转换说明符不匹配,则行为未定义。例如,如果你写

printf("%d\n", fruit);

当您真正传递 a 时,您会告诉printf期望a ,这是一个逻辑错误。根据底层架构,可能会发生许多不同的事情,因此行为未定义,编译器不必对此做任何特别的事情;任何结果都被认为是“正确的”。真正好的编译器会发出参数与转换说明符不匹配的诊断。大多数人会简单地按原样翻译代码,结果可能是从意外输出到访问冲突的任何结果。 intdouble

同样,如果您没有传递足够的参数来匹配转换说明符的数量,则行为未定义:

printf("%f %d\n", fruit);

如果您传递参数多于转换说明符,则会评估其他参数,否则会被忽略:

printf("%f\n", fruit, apples, bananas);
于 2013-01-23T16:00:49.563 回答
0

%d是用于打印整数的格式说明符,%f打印双精度数。您需要使用格式说明符指定要打印的类型,因为 中使用的参数数量可变C,以便编译器知道下一个参数是什么类型。

于 2013-01-23T14:47:33.437 回答
0

"%f"格式说明符是一种特殊的字符串格式,用于指示您printf要打印的内容double。(更多详情

"%d"格式说明符是一种特殊的字符串格式,用于指示您printf要打印decimalinteger.

于 2013-01-23T14:47:33.610 回答
0

printf无法猜测您的变量是什么类型。因此你给他一个提示:格式。然后该函数可以将您的参数解释为给定类型。

于 2013-01-23T14:48:37.493 回答
0

printf代表print formatted,这意味着您向它提供两种数据:

  • 如何呈现数据(格式字符串)
  • 要呈现什么数据(其余的)。

的格式字符串语法printf在支持此功能的语言之间或多或少是统一的。维基百科有一个很好的描述:格式化占位符

于 2013-01-23T14:50:14.387 回答
0

如果您不希望 4.11 等数字变为 4.110000,您可以使用 %g 而不是 %f。%g 使用 %f 或 %e (智能确定编译器在这种情况下找到更好的方式),它可以很好地在数字末尾切割零。

Scanf 也不是类型安全的,你需要告诉编译器你想要使用什么类型的数据。还有 %d 和 %f ,区别在于 %f 仅指浮点数而不是双精度数。使用 scanf 时,%lf 指的是双精度。

于 2013-01-23T16:38:24.277 回答