C语言中%d和%i格式说明符的区别

  • Post category:C

下面是关于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无法读入非十进制的数字。