我刚刚学习 C,由于涉足 iOS 开发,我对 Objective-C 有一点了解,但是,在 Objective-C 中,我NSLog(@"%i", x);
用来将变量x打印到控制台,但是我一直在阅读一些 C 教程,他们是说使用%d
而不是%i
。
printf("%d", x);
并且都正确地将xprintf("%i", x);
打印到控制台。
这两个似乎让我到了同一个地方,所以我问有经验的开发人员哪个是首选?语义上更正确还是正确?
与 .一起使用时,它们是完全等价的printf()
。就我个人而言,我更喜欢%d
它,它被更频繁地使用(我应该说“它是”的惯用转换说明符int
吗?)。
%i
( and之间的一个区别%d
是,当与 一起使用时scanf()
,then%d
总是需要一个十进制整数,而%i
将0
and0x
前缀识别为八进制和十六进制,但无论如何都没有理智的程序员使用scanf()
,所以这不应该是一个问题。)
我只是在这里添加示例,因为我认为示例更容易理解。
在 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
它打印它时,它会打印八进制的十进制等值,010
即8
.
d
和i
转换说明符的行为与 相同,fprintf
但对fscanf
.
正如其他一些人在他们的回答中所写的那样,打印 an 的惯用方式int
是使用d
转换说明符。
关于i
说明符 and fprintf
,C99 基本原理说:
为了方便程序员,在 C89 中添加了 %i 转换说明符以提供与 fscanf 的 %i 转换说明符的对称性,即使它与 fprintf 一起使用时的 %d 转换说明符具有完全相同的含义。
%d 似乎是打印整数的规范,我从来不知道为什么,它们的行为相同。
两者%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
正如其他人所说,它们在 printf 上产生相同的输出,但在 scanf 上表现不同。由于这个原因,%d
我更喜欢。可以读取%i
打印的数字,您将获得相同的数字。如果您选择使用零填充,则并非总是如此。因为将 printf 格式字符串复制到 scanf 格式字符串是很常见的,所以我会避免使用 ,因为它可能会给您一个令人惊讶的错误介绍:%d
%d
%i
%i
我写的fprintf("%i ...", ...);
你抄写写fscanf(%i ...", ...);
我决定我想更好地对齐列并使字母排序的行为与排序相同:( fprintf("%03i ...", ...);
或%04d
)
现在,当您阅读我的数字时,10 到 99 之间的任何数字都被解释为八进制。哎呀。
如果你想要十进制格式,就这么说吧。