61

我刚刚学习 C,由于涉足 iOS 开发,我对 Objective-C 有一点了解,但是,在 Objective-C 中,我NSLog(@"%i", x);用来将变量x打印到控制台,但是我一直在阅读一些 C 教程,他们是说使用%d而不是%i

printf("%d", x); 并且都正确地将xprintf("%i", x);打印到控制台。

这两个似乎让我到了同一个地方,所以我问有经验的开发人员哪个是首选?语义上更正确还是正确

4

6 回答 6

74

与 .一起使用时,它们是完全等价的printf()。就我个人而言,我更喜欢%d它,它被更频繁地使用(我应该说“它是”的惯用转换说明符int吗?)。

%i( and之间的一个区别%d是,当与 一起使用时scanf(),then%d总是需要一个十进制整数,而%i0and0x前缀识别为八进制和十六进制,但无论如何都没有理智的程序员使用scanf(),所以这不应该是一个问题。)

于 2013-06-26T20:17:58.397 回答
23

我只是在这里添加示例,因为我认为示例更容易理解。

在 printf() 中,它们的行为相同,因此您可以使用任何 %d 或 %i。但是它们在 scanf() 中的行为不同。

例如:

int main()
{
    int num,num2;
    scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i

    printf("%d\t%d",num,num2);
    return 0;
}

输出:

在此处输入图像描述

您可以看到相同输入的不同结果。

num

我们正在阅读num使用%d,所以当我们输入010它时会忽略第一个0并将其视为小数10

num2

我们正在阅读num2使用%i.

这意味着它将以不同的方式处理小数、八进制和十六进制。

当它给出时,num2 010它会看到前导0并将其解析为八进制。

当我们使用%d它打印它时,它会打印八进制的十进制等值,0108.

于 2014-07-04T13:05:47.143 回答
4

di转换说明符的行为与 相同,fprintf但对fscanf.

正如其他一些人在他们的回答中所写的那样,打印 an 的惯用方式int是使用d转换说明符。

关于i说明符 and fprintf,C99 基本原理说:

为了方便程序员,在 C89 中添加了 %i 转换说明符以提供与 fscanf 的 %i 转换说明符的对称性,即使它与 fprintf 一起使用时的 %d 转换说明符具有完全相同的含义。

于 2013-06-26T20:27:03.327 回答
1

%d 似乎是打印整数的规范,我从来不知道为什么,它们的行为相同。

于 2013-06-26T20:17:41.627 回答
1

两者%d%i可以用于打印整数

%d 代表“十进制”,%i 代表“整数”。您可以使用 %x 以十六进制打印,使用 %o 以八进制打印。

You can use %i as a synonym for %d, if you prefer to indicate "integer" instead of "decimal."

On input, using scanf(), you can use use both %i and %d as well. %i means parse it as an integer in any base (octal, hexadecimal, or decimal, as indicated by a 0 or 0x prefix), while %d means parse it as a decimal integer.

check here for more explanation

why does %d stand for Integer?

于 2013-06-26T20:24:55.060 回答
0

正如其他人所说,它们在 printf 上产生相同的输出,但在 scanf 上表现不同。由于这个原因,%d我更喜欢。可以读取%i打印的数字,您将获得相同的数字。如果您选择使用零填充,则并非总是如此。因为将 printf 格式字符串复制到 scanf 格式字符串是很常见的,所以我会避免使用 ,因为它可能会给您一个令人惊讶的错误介绍:%d%d%i%i

我写的fprintf("%i ...", ...);

你抄写写fscanf(%i ...", ...);

我决定我想更好地对齐列并使字母排序的行为与排序相同:( fprintf("%03i ...", ...);%04d

现在,当您阅读我的数字时,10 到 99 之间的任何数字都被解释为八进制。哎呀。

如果你想要十进制格式,就这么说吧。

于 2015-05-09T12:55:57.333 回答