我应该使用%i或%d来打印一个整数在C中使用printf()?

uttx8gqw  于 2023-08-03  发布在  其他
关注(0)|答案(6)|浏览(155)

我刚刚学习C,由于涉足iOS开发,我对Objective-C有一点了解。在Objective-C中,我使用NSLog(@"%i", x);将变量 x 打印到控制台。然而,我一直在阅读一些C教程,他们说使用%d而不是%i
printf("%d", x);printf("%i", x);都正确地将 x 打印到控制台。
这两种方法都能让我到达同一个地方,那么哪个更好呢?是一个语义上更正确还是更正确?

brccelvz

brccelvz1#

当与printf()一起使用时,它们完全等效。我个人比较喜欢%d。它的使用频率更高(我应该说“它是int的惯用转换说明符”吗?).
(One %i%d之间的区别是,当与scanf()一起使用时,%d总是期望十进制整数,而%i00x前缀识别为八进制和十六进制,但无论如何没有理智的程序员使用scanf(),所以这不应该是一个问题。

kognpnkq

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

我们使用%d读取num,因此当我们输入010时,它会忽略第一个0并将其视为十进制10

num2

我们使用%i读取num2
这意味着它将以不同的方式处理小数、八进制和十六进制。
当它给予num2010时,它会看到前导0并将其解析为八进制。
当我们使用%d打印它时,它打印出八进制010的十进制等价物,即8

1cklez4t

1cklez4t3#

di转换说明符的行为与fprintf相同,但它们的行为与fscanf不同。
正如其他人在他们的回答中所写的那样,打印int的惯用方法是使用d转换说明符。
关于i说明符和fprintfC99 Rationale 表示:
为了方便程序员,在C89中添加了%i转换说明符,以提供与fscanf的%i转换说明符的对称性,即使它与fprintf一起使用时具有与%d转换说明符完全相同的含义。

ztigrdn8

ztigrdn84#

%d%i都可以用来打印整数。
%d代表“decimal”,%i代表“integer”。您可以使用%x以十六进制打印,使用%o以八进制打印。
如果您更喜欢表示“integer”而不是“decimal”,则可以使用%i作为%d的同义词。
在输入时,使用scanf(),您可以同时使用%i和%d。%i表示将其解析为任意进制的整数(八进制、十六进制或十进制,由0或0x前缀表示),而%d表示将其解析为十进制整数。
点击这里查看更多解释:

slmsl1lt

slmsl1lt5#

%d似乎是打印整数的标准,我从来没有弄清楚为什么,它们的行为是相同的。

lyr7nygr

lyr7nygr6#

正如其他人所说,它们在printf上产生相同的输出,但在scanf上表现不同。我更喜欢%d而不是%i。用%d打印的数字可以用%d读取,您将得到相同的数字。对于%i,如果您选择使用零填充,则情况并非总是如此。因为将printf格式的字符串复制到scanf格式的字符串是很常见的,所以我会避免%i,因为它可能会给予你一个令人惊讶的错误介绍:
我写fprintf("%i ...", ...);
你抄下来写fscanf(%i ...", ...);
我决定要更好地对齐列,并使字母排序的行为与排序相同:fprintf("%03i ...", ...);(或%04d
现在当你读我的数字时,10到99之间的任何数字都是用八进制来解释的。哎呀。
如果你想要十进制格式,就说出来。

相关问题