Objective c 有人能给我解释一下%f和%d的用途吗? #包括 int main(int argc,const char*argv[] { 浮苹果=1.1; 漂浮香蕉=2.2; 双份水果=苹果+香蕉; printf(“%f.\n”,水果); 返回0; }
好吧。。。。那么,为什么在这个过程中需要%f呢?我知道它正在为我打印“水果”的十进制符号,但为什么我不能要求程序打印数字“水果”?是因为我必须声明我是否希望“水果”以十进制%f或科学符号%e打印?我有时也会遇到%d。这意味着什么?Objective c 有人能给我解释一下%f和%d的用途吗? #包括 int main(int argc,const char*argv[] { 浮苹果=1.1; 漂浮香蕉=2.2; 双份水果=苹果+香蕉; printf(“%f.\n”,水果); 返回0; },objective-c,c,Objective C,C,好吧。。。。那么,为什么在这个过程中需要%f呢?我知道它正在为我打印“水果”的十进制符号,但为什么我不能要求程序打印数字“水果”?是因为我必须声明我是否希望“水果”以十进制%f或科学符号%e打印?我有时也会遇到%d。这意味着什么?%d是用于打印整数的格式说明符,%f打印双精度数字。由于在C中使用了可变数量的参数机制,因此需要使用格式说明符指定打印内容的类型,以便编译器知道下一个参数是什么类型。格式说明符是一种特殊的字符串格式,用于向printf指示要打印double。() %d”格式说明符是一种
%d
是用于打印整数的格式说明符,%f
打印双精度数字。由于在C
中使用了可变数量的参数机制,因此需要使用格式说明符指定打印内容的类型,以便编译器知道下一个参数是什么类型。格式说明符是一种特殊的字符串格式,用于向printf
指示要打印double
。()
%d”
格式说明符是一种特殊的字符串格式,用于向printf
指示要打印十进制
或整数printf
无法猜测变量的类型。所以你给他一个提示:格式。然后该函数可以将参数解释为给定类型。printf
代表print formatted
,这意味着您向它提供了两种数据:
- 如何显示数据(格式字符串)
- 要呈现的数据(其余)
printf
的格式字符串语法在支持此功能的语言之间或多或少是统一的。维基百科有一个很好的描述:。如果你看一下,你就会知道这些值作为
%d:int格式说明符
%f:浮点格式说明符
被称为格式说明符
printf也是库中定义的一个简单方法
根据参数,它会打印值
比如说
#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;
}
现在如果你写信
int a = 5;
float b = 5.43 ;
printf("%f",a);
printf("%d",b);
int printf(const char * restrict format, ...);
printf("%7.2f\n", fruit);
它打印存储在变量a==>>中的整数值,即5
printf("%d",a);
它打印存储在变量b==>>中的浮点值,该变量为5.430000//,最多六位
如果你试着用代码
printf("%f",b);
这两行都打印一个称为垃圾值的值,该值来自未知位置,因为您使用了错误的格式说明符
你可以参考
:获取格式说明符列表
要保存:
看,这有点复杂,如果我不能解释清楚,那么让我知道我会尝试创建一个有更好答案的差异问题
实际发生的是
当你写作时
int a = 5;
float b = 5.43 ;
printf("%f",a);
printf("%d",b);
int printf(const char * restrict format, ...);
printf("%7.2f\n", fruit);
然后在内存中分配2字节=16位,如
000000000000001
但是,当您尝试将%f作为格式说明符以浮点形式打印时
它要求一个4字节=32位的表达式
但您得到的是16位表示
最重要的一点是
浮点数的第16位保留为“.”,即十进制
那么你的
000000000000001
变成
=10(二进制)//2(十进制)
所以小数点之前的值变为2,而不是5
由于浮点仍然有16位,代表小数点后的值
int变量只提供16位来表示十进制之前的值
因此,表示小数点后的值的最后16位将拾取垃圾值
这些垃圾值表示一些随机二进制值
最终会产生一些价值
所以你的输出总是2.5左右
当每台机器拾取垃圾值时,这一部分会有所不同
但按照给定的解释,小数点前的值始终相同
我希望这有用
但是如果它不让我知道
我将设法提出一个更好的代表
另外,printf
函数的原型是
int a = 5 // 101 in binary
第一个参数始终是描述输出格式的文本字符串(因此不能只编写printf(fruit);
)。…
表示printf
可以在格式字符串后附加零个或多个参数(这称为可变函数)
不幸的是,变量函数不能自动知道参数列表的变量部分中传递给它们的参数的数量或类型;他们只看到最后一个固定参数之后的下一个可用参数的起始地址。您必须以某种方式将该信息作为固定参数的一部分进行传递。使用printf
,附加参数的数量和类型由格式字符串中的转换说明符指示。所以当你写作的时候
int a = 5;
float b = 5.43 ;
printf("%f",a);
printf("%d",b);
int printf(const char * restrict format, ...);
printf("%7.2f\n", fruit);
转换说明符%f
告诉printf
,在格式字符串后面还有一个类型为double
的附加参数。转换说明符还告诉printf
值的显示格式。例如,在
printf("%f\n", fruit);
转换说明符%7.2f
告诉printf
将值显示为7个字符的宽字段,小数点后有2位数字,或9999.99
如果参数的类型与转换说明符不匹配,则行为未定义。例如,如果你写
int a = 5;
float b = 5.43 ;
printf("%f",a);
printf("%d",b);
int printf(const char * restrict format, ...);
printf("%7.2f\n", fruit);
您告诉printfint
在实际传递double
时需要int
,这是一个逻辑错误。根据底层架构的不同,可能会发生许多不同的事情,因此行为没有定义,编译器不必对此做任何特别的事情;任何结果都被认为是“正确的”。非常好的编译器会发出一个诊断,指出参数与转换说明符不匹配。大多数人会