int main()
{
int foo = 7.89;
printf("%f %d", foo, foo);
printf("%d %f", foo, foo);
}
请告诉我为什么2 printf的输出不同。特别是对于 foo ,当使用格式说明符 %d 时,我希望它应该显示 相同的价值 。 我知道,要使用 int 变量打印/转换为 float 类型转换。
答案 0 :(得分:6)
格式为%f,printf需要double类型的参数(float会自动转换为double)。正如您所做的那样,传递一个int会导致未定义的行为。未定义的行为意味着"任何事情都可能发生"。所以你的问题的答案是:因为你的代码调用了未定义的行为。
答案 1 :(得分:3)
printf
不知道你传递了什么类型,它从格式说明符中推断出来。因此%f
告诉它它正在接收double
,但您正在传递一个' int`。为什么要理智/可预测的事情发生?
答案 2 :(得分:1)
如前所述,由于您使用了错误的格式说明符,因此这是未定义的行为。 C标准允许符合要求的实现做任何事情。它可以崩溃,它可以燃烧,它可以打印7。
但要真正回答你的问题,请考虑函数printf及其收到的内容。在两次调用中,都会发送两个整数7的副本。在典型系统中,整数是32位。因此printf获取64位参数,格式字符串除外。
在对printf的两次调用中,您的格式字符串声称您发送的是double(%f)和一个整数(%d)。在今天的典型系统中,双精度是64位。所以你发送了64位数据,但声称发送了96位数据。 printf将做什么(再次,在今天的典型系统上) 是查看应该的参数所在的位置, 所有96位,并在那里采取内容。 由于使用的数据多于实际存在的数据, 将使用来自周围记忆的一些不相关的数据。
在特定系统上,比如在运行Linux的64位Intel处理器上使用某个版本的GCC编译的程序,可以预测输出。但是你需要查看所涉及函数(main和printf)的堆栈帧布局,以及确切地存储哪些位。
我不确定为什么你会期望从这两个电话中得到相同的结果?
答案 3 :(得分:0)
你需要匹配变量类型和参数,你正在传递。了解clang
如何抱怨:
cc test1.c -o test1
test1.c:3:15: warning: implicit conversion from 'double' to 'int' changes value from 7.89 to 7 [-Wliteral-conversion]
int foo = 7.89;
~~~ ^~~~
test1.c:5:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
printf("%f %d", foo, foo);
^
test1.c:5:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
test1.c:5:21: warning: format specifies type 'double' but the argument has type 'int' [-Wformat]
printf("%f %d", foo, foo);
~~ ^~~
%d
test1.c:7:26: warning: format specifies type 'double' but the argument has type 'int' [-Wformat]
printf("%d %f", foo, foo);
~~ ^~~
%d
4 warnings generated.
问题是由于printf
将从堆栈中弹出错误的字节数,然后它将无法从您的变量中读取正确的值。
如果您确实想要打印浮动的int
值,可以使用ciel
或floor
来转换或舍入我。
float foo = 3.14f;
printf("%f %d", foo, (int) foo);
//printf("%f %d", foo, ceil(foo));
//printf("%f %d", foo, floor(foo));
编辑:我正在使用Java / ObjC太多了...抱歉:(
答案 4 :(得分:0)
您声明一个INT类型的变量,但您给出了一个实数的分配(7.89而不是7或8)。你只需要改变THE int foo TO(double)foo,或TO(float)foo --- double可以限制比float更多的内存空间,这意味着更精确的数字----然后在PRINTF类型%lf中为双OR% f浮动,你应该没问题。
int main()
{
float foo = 7.89;
printf("%f %f", foo, foo);
}
//or
int main ()
{
double foo = 7.89;
printf("%lf %lf", foo, foo);
}