不了解printf()

时间:2018-09-01 07:37:51

标签: c

我发现了一个问题,要求输出以下语句:

printf("%d"+1,123);

给出的答案是d,其解释是:由于"%d"是字符串,因此+1在这里表示d

123只是被忽略。 我的第一个问题是:为什么123被忽略?

我还运行了以下语句

printf("%d"+2,123);

它什么也没打印。该代码运行但没有错误。 我的第二个问题是:为什么代码编译时没有错误?

第三次,我做了以下事情:

printf("%d"+0,123);

输出为123。 所以我在这里真的很困惑。如果+1打印d,那么+0是否应该打印%

3 个答案:

答案 0 :(得分:6)

想象一个字符串:

char str[] = "%d";

现在我们知道:

str[0] == '%'
str[1] == 'd'
str[2] == '\0' = 0x00
str+2 == &str[2] == the address of the byte 0x00 inside the str string == ""
printf("%d", 123); is the same as printf(str, 123)
printf("%d" + 2, 123); if the same as printf("", 123); and it will print "", ie. nothing

答案 1 :(得分:2)

回答第一个问题: 123被忽略,因为在写printf(“%d” +1,123)时,+1将指针放在%d的索引1上,即d。由于要打印123,我们需要将指针指向%并访问%d而不仅仅是d。因此,在这种情况下,只有d打印出来。

回答第二个问题 它的编译没有错误,因为printf()只是一个函数,它接受各种参数。有关printf()的更多详细信息,您可以访问this link

在第三种情况下,即printf(“%d” +0,123),输出为123,因为此处的指针位置为0,即为%,我们可以访问%d。因此,我们得到123作为输出。

希望这会对您有所帮助。

答案 2 :(得分:1)

带有加号的字符点导致一个字符点。

printf只是一个功能

因此需要多种参数-varags

  1. “%d” +1只是d正好是一个字符串

  2. “%d” +2-将为空字节-无

  3. “%d” +0-将为%d-因此是预期的输出-请参见手册页