c语言printf语句(c语言printf用法例子)


C语言程序开发中,很多程序员喜欢使用 printf() 函数打印一些日志,便于观察和调整程序,因此 printf() 函数是一个使用相当频繁的函数。有趣的问题,C语言printf整数占位符为什么是%d呢,而不是%i呢?

有趣的问题

有趣的问题

一般来说,所谓日志,其实就是一些字符串,printf() 函数为了方便的将其他(字符串以外)类型的参数整合入字符串,提供了一些占位符,例如 %s, %d, %f, %p 等。

一个有趣的问题是,%s 可以填充字符串(string),%f 可以填充浮点数(float),%p 则可以填充一个指针(pointer),这些占位符分别是用对应英文单词的首字母表示的,因此比较好记。那么常用于填充整数的 %d 为什么不按照 integer 的首字母 %i 呢?有趣的问题,C语言printf整数占位符为什么是%d呢,而不是%i呢?

填充整数的 %d 为什么不按照 integer 的首字母 %i 呢?

printf() 函数的占位符

事实上,%d 中的 d 并不表示 integer,而是表示 decimal(10进制)。类似的 %x 常用于打印 16 进制整数(hexadecimal), %o 常用于打印 8 进制整数(octal)。C语言程序开发中的整数显然可以是任意进制的。

调用 printf() 函数时,若是希望打印一个一个整数,完全可以使用%i作为占位符,下面是一段C语言代码示例:

#include <stdio.h>
int main()
{
printf("%in", 5);
return 0;
}

编译并执行这段C语言代码,得到的的输出是符合预期的:

# gcc t.c
# ./a.out
5

在很多C语言程序中,使用 printf() 打印整数使用的占位符更多是 %d,因为它更加具体,表明希望将整数以更符合人类习惯的 10 进制输出。

有趣的问题,C语言printf整数占位符为什么是%d呢,而不是%i呢?

类似的,调用 scanf() 函数读取用户输入的整数时,也可以同时使用 %i 和 %d,%i 占位符意味着用户输入的整数将被解析为任意进制的整数(八进制、十六进制、十进制等),而 %d 的意义更加明确——将整数解析为十进制整数。

下面再来看一段C语言代码示例:

#include <stdio.h>
int main() {
 int out = 10;
 int in[4];
 printf("%d %i %x %on", out, out, out, out);
 sscanf("010 010 010 010", "%d %i %x %o", &in[0], &in[1], &in[2], &in[3]);
 printf("%d %d %d %dn", in[0], in[1], in[2], in[3]);
 sscanf("0x10 10 010", "%i %i %i", &in[0], &in[1], &in[2]);
 printf("%d %d %dn", in[0], in[1], in[2]);
 return 0;
}

有趣的问题,C语言printf整数占位符为什么是%d呢,而不是%i呢?

C语言代码示例

编译这段C语言代码并执行,得到如下输出:

# gcc t1.c
# ./a.out 
10 10 a 12
10 8 16 8
16 10 8

我们将注意力放在 %d 和 %i 的区别上,应该能够发现,010 这个数字在使用 %d 占位符时,会被解析为十进制的 10,而使用 %i 占位符时,则被解析为十进制的 8。类似的,其他异同留给读者自己体会了。

小结

本节主要讨论了一个有趣的问题,很多C语言初学者在刚刚接触 printf() 函数的占位符时,常觉得这些占位符很难记忆,其实它们大都是对应数据类型英文单词的首字母。由于C语言程序中的整数常常有不同进制之分,因此更常使用的整数占位符不是integer的首字母 %i,而是具有更加明确含义的,也即十进制整数的 %d,弄清这一点,占位符就很好记了。有趣的问题,C语言printf整数占位符为什么是%d呢,而不是%i呢?

点个关注吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论