谁能向我解释%f和%d的目的?

时间:2013-01-23 14:46:09

标签: objective-c c

#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。那会带来什么?

7 个答案:

答案 0 :(得分:2)

如果您看一下definition of the printf function,那么您就会知道这些值传递为 %d:int格式说明符 %f:浮点格式说明符

被称为格式说明符

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

例如

int a = 5;
float b = 5.43 ;

现在如果你写

printf("%d",a);

它打印存储在变量a ==&gt;&gt;中的整数值。这是5

printf("%f",b);

它打印存储在变量b ==&gt;&gt;中的浮点值。这是5.430000 //最多六位数

如果您尝试使用代码

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

这两行打印出一个叫做垃圾值的尴尬值,因为您使用了错误的格式说明符而从未知位置获取

您可以参考link

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

Alok Save:

看到这有点复杂,如果我无法解释清楚那么让我知道我会尝试用更好的答案创建一个差异问题。

实际发生的是 当你写作

int a = 5 // 101 in binary

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


0000000000000101

但是当你尝试将%f作为格式说明符打印为float时 它要求4字节= 32位表达式 但你得到的是16位代表 而最重要的一点 浮动的第16位保留为'。'这是十进制的 所以你的


0000000000000101 变


  1. = 10 in binary // 2 in decimal value
  2. 所以十进制之前的值变为2而不是5 因为浮点数仍然有16位,表示小数后的值 并且int变量仅提供16位来表示十进制之前的值 因此,表示后十进制值的最后16位选择垃圾值 这些垃圾值代表一些随机二进制值 最终会产生一些价值

    所以你的输出总是2.something

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

    我希望这可以提供

    但如果它不让我知道

    我会尝试提出更好的代表性

    link也非常有帮助

答案 1 :(得分: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);

当你真正传递printf时,你告诉int期待double,这是一个逻辑错误。根据底层架构,可能会发生任何数量的不同事情,因此行为将保留 undefined ,并且编译器不必特别针对它做任何事情; 任何结果都被视为“正确”。非常好的编译器将发出一个诊断,该参数与转换说明符不匹配。大多数人只是按原样翻译代码,结果可以是从意外输出到访问冲突的任何内容。

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

"%f"格式说明符是一种特殊字符串格式,用于向printf表明您要打印double。 (For more details

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

Scanf也不是类型安全的,您需要告诉编译器您想要使用哪种类型的数据。还有%d和%f的差异%f仅指浮点而不是加倍。使用scanf时,%lf指的是double。