#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a = 5;
float b = 10;
double c = 15;
printf("%d %f %lf\n", a, a, a);
printf("%d %f %lf\n", b, b, b);
printf("%f\n", b);
printf("%d %f %lf\n", c, c, c);
printf("%lf\n", c);
}
输出:
5 0.000000 0.000000
0 0.000000 0.000000
10.000000
0 0.000000 0.000000
15.000000
我无法理解为什么它在第一种情况下为b和c打印0,即使是正确的匹配格式说明符?
我正在使用Visual Studio。
答案 0 :(得分:1)
使用错误的转换规范会调用未定义的行为。您可能会得到预期或意外的结果甚至程序崩溃。
C11:7.21.6格式化输入/输出功能:
如果转化规范无效,则行为未定义。
答案 1 :(得分:1)
您应该知道C编译器不足够聪明,无法理解格式字符串并正确转换以下参数。因此,您的参数可能会被错误处理;到printf
,它们只是堆栈上的一些字节。值{15}的double
的表示最有可能在堆栈上包含几个0的字节,printf
读为int
,因为你告诉它在格式字符串中这样做
答案 2 :(得分:0)
是的,您在格式字符串的一部分中使用了正确的格式说明符,但由于您已经在格式字符串中使用了错误的格式说明符之前的,所以&# 39;已经让一切都破裂了。
具体来说,printf
已经失去对齐&#34;使用您的数据参数替换%f
和%lf
位。