C中的长度修饰符与转换说明符

时间:2015-03-09 17:43:32

标签: c

我是C的新手,我很难理解两者之间的区别。有人可以同时使用两个例子吗?如果我错了,请纠正我的逻辑,但这是我理解以下内容的方式:

int a = 10; 
printf("%d\n", a); 

%d的目的是通知编译器我们要打印的变量是int类型。至少,这是我到目前为止一直在思考它的方式。谢谢。

3 个答案:

答案 0 :(得分:2)

在类似%ld的格式字符串中,字母l将是长度修饰符,它向标准库函数(而不是编译器)指示您希望关联的参数被解释为long int。有一个方便的图表,显示了各种长度/转换字符组合here on cplusplus.com所做的标准解释。

编译器在编译时知道所有变量的类型,但由于可变参数函数的工作原理,printf函数无法在运行时确定参数类型。您可以自己试验,看看长度修饰符和转换说明符的不同组合如何为传递给printf的相同数据产生完全不同的结果。

答案 1 :(得分:1)

* printf()系列函数采用可变数量的参数,因此您需要传递一个格式字符串,其中包含让函数知道当前已解析参数类型的说明符。

一个简单的例子就像这个 1

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

int xprintf(const char *format, ...)
 {
    char    chr;
    int     count;
    va_list va;

    count = 0;
    va_start(va, format);
    while ((chr = *format++) != '\0')
     {
        if ((chr == '%') && ((chr = *format++) == 'd'))
         {
            int argument;

            argument = va_arg(va, int);
            count   += printf("%d", argument);
         }
        else
         {
            fputc(chr, stdout);
            count += 1;
         }
     }

    return count;
 }

int
main(void)
 {
    xprintf("example %d\n", 4);
    return 0;
 }

编译器不需要知道任何关于它的信息,但它有时会这样做,它会帮助你知道错误地传递错误的参数类型,但是带有错误,额外的,较少参数的代码可以编译,然后是在这些情况下无法指定程序。


1 请注意,我使用标准printf()作为辅助函数来打印整数。

答案 2 :(得分:0)

转换规范告诉printf参数的类型以及您希望如何格式化它的输出。长度修饰符是转换规范的一部分,它为相应的参数提供了printf其他类型信息。

printf是一个可变函数,这意味着某些类型的参数被提升到更有限的一组类型;类型charshort的参数将提升为int,类型float的参数将提升为double等。长度修饰符可帮助您传达原始参数键入printf,因此它会将提升的参数正确转换回原始类型。

所以,例子:

int   aRegularInt     = 64;
short aShortInt       = 64;
char  aReallyShortInt = 64;

printf( "aRegularInt     = %d\n",   aRegularInt );
printf( "aShortInt       = %hd\n",  aShortInt );
printf( "aReallyShortInt = %hhd\n", aReallyShortInt );
printy( "aReallyShortInt = %c\n",   aReallyShortInt );

转换规范%d表示参数的类型为int,输出应为十进制数字字符串,负值为前导-。没有长度修饰符。

转换规范%hd表示参数的类型为short int。输出与上面相同。 h是长度修饰符。

转换规范%hhd表示参数的类型为char。输出与上面相同。在这种情况下,长度修饰符为hh

转换规范%c表示参数的类型为int,输出应该是与该字符代码对应的字形(在ASCII中,代码64的字符为{{1} })。