下面是关于C语言中%d和%i格式说明符的区别的详细解释和使用攻略。
什么是%d和%i格式说明符
在C语言中,%d
和%i
都是格式化输出函数printf()
和scanf()
中常用的格式说明符,用于以带符号的十进制整数形式输出和输入数据。它们的使用方法非常相似,但是它们在某些细节处的区别还是有一些需要注意的地方。
区别
它们的基本用法都是一样的,只需要在格式化输出或输入字符串中使用相应的格式说明符,后面依次跟上一个或多个需要输出或输入的整型变量名即可。例如,要输出一个整数a的值,可以这样写:
printf("%d", a); // 或者使用printf("%i", a);
这里%d和%i都可以使用,输出结果都是一样的。但是,它们在以下方面还是有所区别:
1、输入的区别
在scanf()
函数中,%i可以读入八进制和十六进制等不同进制的数,而%d默认只能读入十进制数。例如:
int a, b;
scanf("%i", &a); // 可以输入十进制以外的数字
scanf("%d", &b); // 只能输入十进制
此外,如果输入的数以0开头,则%i视为八进制数,%d视为十进制数。因此,%i可以用来读入八进制和十六进制数,%d只能读入十进制数。
2、输出的区别
在使用printf()函数输出整数时,%d和%i都可以正常输出整数。但是,当输出宽度小于数据宽度时,它们之间就会存在区别:
int a = 10;
printf("|%5d|", a); // 输出结果为 "| 10|"
printf("|%5i|", a); // 输出结果为 "| 10|"
printf("|%2d|", a); // 输出结果为 "|10|"
printf("|%2i|", a); // 输出结果为 "|10|"
可以看到,在输出宽度小于数据宽度时,%d会在左边添加空格,而%i则会在右边添加空格。因此,在一般情况下,最好还是用%d,因为它更符合大部分程序员的输入习惯。
示例说明
为了更加清晰地表现出区别,我们来看两个示例:
示例1
#include<stdio.h>
int main(){
int d = 123;
int o = 0123;
int h = 0x123;
printf("d=%i, d=%d\n", d, d);
printf("o=%i, o=%d\n", o, o);
printf("h=%i, h=%d\n", h, h);
return 0;
}
运行结果为:
d=123, d=123
o=83, o=83
h=291, h=291
可以看到,使用%i时,可以正常读入八进制和十六进制的数,而%d只能读入十进制的数,输出时结果是一致的。
示例2
#include<stdio.h>
int main(){
int a = 1234;
printf("%5d\n", a);
printf("%5i\n", a);
printf("%2d\n", a);
printf("%2i\n", a);
return 0;
}
运行结果为:
1234
1234
1234
1234
可以看到,在输出宽度小于数据宽度时,%d会在左边添加空格,而%i则会在右边添加空格。
结论
虽然在一些特殊的情况下非常细微的差异还是可以通过%i和%d来区分,但在大部分的情况下,这两个格式说明符是可以互相替换的。但是,当我们遇到一些特殊情况,比如需要读入八进制或十六进制时,最好还是使用%i,因为%d无法读入非十进制的数字。