格式字符串参数后“+1”对printf()的影响

我有一些与此代码相关的问题。 printf的参数是const char*...类型(可变参数列表)。

1)为什么程序的输出是d而不是127
2)是否将+1转换为字符串并传递给const char*类型的参数变量?

 #include int main() { printf("%d"+1 , 127); //how this will get executed? return 0; } 

输出:

 d 

第一个参数是指向char的指针。
文字"%d"将是指向'%'的指针,其后面隐含着'd''\0' 。 它是一个指向char的指针,因为它是字符串文字的C表示:末尾带有'\0'的字符序列; 表示用作参数等作为char的指针。
但根据指针算法, "%d"+1是指向'd'的指针,后跟'\0'
两者都是零终止的,因为它适合printf的参数。

所以输出是一样的

 printf("d", ignored); 

127变为“忽略”,即它被忽略,因为"d"告诉printf不要期望任何东西,因为它没有任何特殊的字符序列,例如“%someletter”。 所以它不会期望,不会寻找任何东西,也不会在它认为给出的完全正常的字符串之外进行任何打印。
但请注意,其他参数(格式字符串中未包含的参数)会被评估然后被忽略。 这是相关的,因为该评估的任何副作用(例如函数调用)实际上都会发生。
详情请参见此处:
http://en.cppreference.com/w/c/io/fprintf

让我试着帮助并添加@Yunnosch的答案,你可以做到以下几点:

  char *str = "%d"; printf (str, 127); 

和输出应该是:

 127 

在上面的例子中, str就像这样存储在内存中(这只是一个例子,现实生活中的地址就像0xabcdef12345678):

 address | memory --------+-------------- 0 | % 1 | d 3 | \0 

所以str指向地址0 (或你的系统上的等价物),它持有%printf()获取该地址并从那里开始读取,读取直到它遇到NULL字符’\ 0’。 现在,每当它看到%它会查找下一个字符dcx等,它会从参数列表中读取下一个参数。 如果你提供d它将输出十进制,如果你提供c它将打印字符, x是hex,还有更多。 因此printf()将读取所有字符并用适当的参数替换% ,直到它遇到NULL字符\0 ,但它将从提供的地址开始。

你的情况:

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

与:

 char *str = "%d"; printf (str + 1, 127); // printf receives address of character `d` as starting point 

或者它类似于

 char *str = "%d"; char *str1 = str+1; // increment the address of string by one printf (str1, 127) 

在这两种情况下,它接收d地址并从那里读取,直到它达到\0

如果你这样做:

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

这将是:

 char *str = "%d"; printf (str + 2, 127); 

它会输出任何内容,因为printf()将获得\0的地址。 正如@Yunnosh所说, 127会被忽略。

因此+1+2不会转换为字符串,而是添加到字符串的地址中。

我希望这有帮助,我想我回答了你的两个问题。