我刚刚学习C,由于涉足iOS开发,我对Objective-C有一点了解。在Objective-C中,我使用NSLog(@"%i", x);将变量 x 打印到控制台。然而,我一直在阅读一些C教程,他们说使用%d而不是%i。printf("%d", x);和printf("%i", x);都正确地将 x 打印到控制台。这两种方法都能让我到达同一个地方,那么哪个更好呢?是一个语义上更正确还是更正确?
NSLog(@"%i", x);
%d
%i
printf("%d", x);
printf("%i", x);
brccelvz1#
当与printf()一起使用时,它们完全等效。我个人比较喜欢%d。它的使用频率更高(我应该说“它是int的惯用转换说明符”吗?).(One %i和%d之间的区别是,当与scanf()一起使用时,%d总是期望十进制整数,而%i将0和0x前缀识别为八进制和十六进制,但无论如何没有理智的程序员使用scanf(),所以这不应该是一个问题。
printf()
int
scanf()
0
0x
kognpnkq2#
我只是在这里添加一个例子,因为我认为例子更容易理解。在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读取num,因此当我们输入010时,它会忽略第一个0并将其视为十进制10。
010
10
num2:
num2
我们使用%i读取num2。这意味着它将以不同的方式处理小数、八进制和十六进制。当它给予num2010时,它会看到前导0并将其解析为八进制。当我们使用%d打印它时,它打印出八进制010的十进制等价物,即8。
8
1cklez4t3#
d和i转换说明符的行为与fprintf相同,但它们的行为与fscanf不同。正如其他人在他们的回答中所写的那样,打印int的惯用方法是使用d转换说明符。关于i说明符和fprintf,C99 Rationale 表示:为了方便程序员,在C89中添加了%i转换说明符,以提供与fscanf的%i转换说明符的对称性,即使它与fprintf一起使用时具有与%d转换说明符完全相同的含义。
d
i
fprintf
fscanf
ztigrdn84#
%d和%i都可以用来打印整数。%d代表“decimal”,%i代表“integer”。您可以使用%x以十六进制打印,使用%o以八进制打印。如果您更喜欢表示“integer”而不是“decimal”,则可以使用%i作为%d的同义词。在输入时,使用scanf(),您可以同时使用%i和%d。%i表示将其解析为任意进制的整数(八进制、十六进制或十进制,由0或0x前缀表示),而%d表示将其解析为十进制整数。点击这里查看更多解释:
slmsl1lt5#
%d似乎是打印整数的标准,我从来没有弄清楚为什么,它们的行为是相同的。
lyr7nygr6#
正如其他人所说,它们在printf上产生相同的输出,但在scanf上表现不同。我更喜欢%d而不是%i。用%d打印的数字可以用%d读取,您将得到相同的数字。对于%i,如果您选择使用零填充,则情况并非总是如此。因为将printf格式的字符串复制到scanf格式的字符串是很常见的,所以我会避免%i,因为它可能会给予你一个令人惊讶的错误介绍:我写fprintf("%i ...", ...);你抄下来写fscanf(%i ...", ...);我决定要更好地对齐列,并使字母排序的行为与排序相同:fprintf("%03i ...", ...);(或%04d)现在当你读我的数字时,10到99之间的任何数字都是用八进制来解释的。哎呀。如果你想要十进制格式,就说出来。
fprintf("%i ...", ...);
fscanf(%i ...", ...);
fprintf("%03i ...", ...);
%04d
6条答案
按热度按时间brccelvz1#
当与
printf()
一起使用时,它们完全等效。我个人比较喜欢%d
。它的使用频率更高(我应该说“它是int
的惯用转换说明符”吗?).(One
%i
和%d
之间的区别是,当与scanf()
一起使用时,%d
总是期望十进制整数,而%i
将0
和0x
前缀识别为八进制和十六进制,但无论如何没有理智的程序员使用scanf()
,所以这不应该是一个问题。kognpnkq2#
我只是在这里添加一个例子,因为我认为例子更容易理解。
在printf()中,它们的行为完全相同,因此您可以使用任何%d或%i。但它们在scanf()中的行为不同。
举例来说:
字符串
输出量:
的数据
您可以看到相同输入的不同结果。
num
:我们使用
%d
读取num
,因此当我们输入010
时,它会忽略第一个0
并将其视为十进制10
。num2
:我们使用
%i
读取num2
。这意味着它将以不同的方式处理小数、八进制和十六进制。
当它给予
num2
010
时,它会看到前导0
并将其解析为八进制。当我们使用
%d
打印它时,它打印出八进制010
的十进制等价物,即8
。1cklez4t3#
d
和i
转换说明符的行为与fprintf
相同,但它们的行为与fscanf
不同。正如其他人在他们的回答中所写的那样,打印
int
的惯用方法是使用d
转换说明符。关于
i
说明符和fprintf
,C99 Rationale 表示:为了方便程序员,在C89中添加了%i转换说明符,以提供与fscanf的%i转换说明符的对称性,即使它与fprintf一起使用时具有与%d转换说明符完全相同的含义。
ztigrdn84#
%d
和%i
都可以用来打印整数。%d代表“decimal”,%i代表“integer”。您可以使用%x以十六进制打印,使用%o以八进制打印。
如果您更喜欢表示“integer”而不是“decimal”,则可以使用%i作为%d的同义词。
在输入时,使用scanf(),您可以同时使用%i和%d。%i表示将其解析为任意进制的整数(八进制、十六进制或十进制,由0或0x前缀表示),而%d表示将其解析为十进制整数。
点击这里查看更多解释:
slmsl1lt5#
%d似乎是打印整数的标准,我从来没有弄清楚为什么,它们的行为是相同的。
lyr7nygr6#
正如其他人所说,它们在printf上产生相同的输出,但在scanf上表现不同。我更喜欢
%d
而不是%i
。用%d
打印的数字可以用%d
读取,您将得到相同的数字。对于%i
,如果您选择使用零填充,则情况并非总是如此。因为将printf格式的字符串复制到scanf格式的字符串是很常见的,所以我会避免%i
,因为它可能会给予你一个令人惊讶的错误介绍:我写
fprintf("%i ...", ...);
你抄下来写
fscanf(%i ...", ...);
我决定要更好地对齐列,并使字母排序的行为与排序相同:
fprintf("%03i ...", ...);
(或%04d
)现在当你读我的数字时,10到99之间的任何数字都是用八进制来解释的。哎呀。
如果你想要十进制格式,就说出来。