格式说明符是由初始百分号(%)表示的序列,表示格式说明符,用于指定要从流中检索并存储到附加参数指向的位置的数据的类型和格式。简而言之,它告诉我们要存储哪种类型的数据以及要打印的数据类型。

例如 - 如果我们想使用scanf()和printf()函数读取和打印整数,则使用%i或%d,但%i%d格式说明符都有细微差别。

%d指定带符号的十进制整数,而%i指定整数。

%d和%i的行为与printf相似

printf的%i和%d格式说明符之间没有区别。考虑以下示例。

// C program to demonstrate
// the behavior of %i and %d
// with printf statement
#include <stdio.h>
int main()
{
    int num = 9;
    
    // print value using %d
    printf("Value of num using %%d is = %d\n", num);
    
    // print value using %i
    printf("Value of num using %%i is = %i\n", num);
    return 0;
}
输出:
使用%d的num的值是= 9
使用%i的num的值是= 9

%d和%i在scanf中的行为不同

%d假设基数为10而%i自动检测到基数。因此,两个说明符在与输入说明符一起使用时表现不同。因此,012将是10%,%i,但12%,%d。

  • %d将整数值作为带符号的十进制整数,即它取负值和正值,但值应为十进制,否则将打印垃圾值。考虑以下示例。
  • %i将整数值作为带十进制,十六进制或八进制类型的整数值。
    要以十六进制格式输入值 - 值应由前面的“0x”和八进制格式的值提供 - 值应由前面的“0”提供。

考虑以下示例。

// C program to demonstrate the difference
// between %i and %d specifier
#include <stdio.h>
int main()
{
    int a, b, c;
    printf("Enter value of a in decimal format:");
    scanf("%d", &a);
    printf("Enter value of b in octal format: ");
    scanf("%i", &b);
    printf("Enter value of c in hexadecimal format: ");
    scanf("%i", &c);
    printf("a = %i, b = %i, c = %i", a, b, c);
    return 0;
}
输出:
以十进制格式输入a的值:12
以八进制格式输入b的值:012
以十六进制格式输入c的值:0x12
a = 12,b = 10,c = 18

说明:a
的十进制值为12
b的十进制值为12(八进制)为10
c的十进制值为12(十六进制)为18

 

C语言中%d和%i格式说明符之间的差异-IDC帮帮忙