我是C的新手,我很难理解两者之间的区别。有人可以同时使用两个例子吗?如果我错了,请纠正我的逻辑,但这是我理解以下内容的方式:
int a = 10;
printf("%d\n", a);
%d
的目的是通知编译器我们要打印的变量是int类型。至少,这是我到目前为止一直在思考它的方式。谢谢。
答案 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
是一个可变函数,这意味着某些类型的参数被提升到更有限的一组类型;类型char
和short
的参数将提升为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} })。