C中的格式说明符

时间:2016-03-17 04:24:11

标签: c floating-point

#include<conio.h>
#include<stdio.h>

main()
{
    printf("%d %f ", 4.0, 4.0);
    getch();
}

我的输出为0 4.000000。我想知道准确的原因。

2 个答案:

答案 0 :(得分:2)

主要原因是因为您错误地使用了格式说明符......

执行此操作时:

printf("%d %f ",4.0,4.0f);

你告诉你的编译器你正在打印一个整数和一个 float ,你正在传递2个浮点,所以编译器不会强制转换浮点数到int

做instad

printf("%d %f ",(int)4.0,4.0f);

有关格式说明符的更多参考..

常用变量类型显示

%c char单个字符

%d(%i)int signed integer

%e(%E)浮点数或双指数格式

%f float

%lf double

%g(%G)浮动或双重使用%f或%e根据需要

%o无符号八进制值

%p指针地址存储在指针

%char字符序列数组

%u int无符号十进制

%x(%X)int无符号十六进制值

答案 1 :(得分:0)

printf函数不知道变量参数列表中预期的数据类型,除非您告诉它在那里有什么。这是格式说明符的数据类型部分。

你发现了什么,你告诉它第一个参数是int,但是你给了它一个不同的数据类型。结果未定义。

如果你想看到printf在幕后做的事情的类型,那么请阅读variadic functions in C。这将使您更好地了解为什么它对于函数期望与您提供的类型相同的类型如此重要。

提供从我刚刚提供的链接中获取的代码示例:

#include <stdio.h>
#include <stdarg.h>

void simple_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    while (*fmt != '\0') {
        if (*fmt == 'd') {
            int i = va_arg(args, int);
            printf("%d\n", i);
        } else if (*fmt == 'c') {
            // note automatic conversion to integral type
            int c = va_arg(args, int);
            printf("%c\n", c);
        } else if (*fmt == 'f') {
            double d = va_arg(args, double);
            printf("%f\n", d);
        }
        ++fmt;
    }

    va_end(args);
}

int main(void)
{
    simple_printf("dcff", 3, 'a', 1.999, 42.5); 
}