格式说明符的差异如何影响该值?

时间:2014-07-02 15:18:13

标签: c

#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。

3 个答案:

答案 0 :(得分:1)

使用错误的转换规范会调用未定义的行为。您可能会得到预期或意外的结果甚至程序崩溃。

C11:7.21.6格式化输入/输出功能:

  

如果转化规范无效,则行为未定义

答案 1 :(得分:1)

您应该知道C编译器足够聪明,无法理解格式字符串并正确转换以下参数。因此,您的参数可能会被错误处理;到printf,它们只是堆栈上的一些字节。值{15}的double的表示最有可能在堆栈上包含几个0的字节,printf读为int,因为你告诉它在格式字符串中这样做

答案 2 :(得分:0)

是的,您在格式字符串的一部分中使用了正确的格式说明符,但由于您已经在格式字符串中使用了错误的格式说明符之前的,所以&# 39;已经让一切都破裂了。

具体来说,printf已经失去对齐&#34;使用您的数据参数替换%f%lf位。