我有一些与此代码相关的问题。 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'
和' '
。 它是一个指向char
的指针,因为它是字符串文字的C表示:末尾带有' '
的字符序列; 表示用作参数等作为char
的指针。
但根据指针算法, "%d"+1
是指向'd'
的指针,后跟' '
。
两者都是零终止的,因为它适合printf的参数。
所以输出是一样的
printf("d", ignored);
127变为“忽略”,即它被忽略,因为"d"
告诉printf不要期望任何东西,因为它没有任何特殊的字符序列,例如“%someletter”。 所以它不会期望,不会寻找任何东西,也不会在它认为给出的完全正常的字符串之外进行任何打印。
但请注意,其他参数(格式字符串中未包含的参数)会被评估然后被忽略。 这是相关的,因为该评估的任何副作用(例如函数调用)实际上都会发生。
详情请参见此处:
让我试着帮助并添加@Yunnosch的答案,你可以做到以下几点:
char *str = "%d"; printf (str, 127);
和输出应该是:
127
在上面的例子中, str
就像这样存储在内存中(这只是一个例子,现实生活中的地址就像0xabcdef12345678):
address | memory --------+-------------- 0 | % 1 | d 3 |
所以str
指向地址0
(或你的系统上的等价物),它持有%
, printf()
获取该地址并从那里开始读取,读取直到它遇到NULL字符’ 0’。 现在,每当它看到%
它会查找下一个字符d
, c
, x
等,它会从参数列表中读取下一个参数。 如果你提供d
它将输出十进制,如果你提供c
它将打印字符, x
是hex,还有更多。 因此printf()
将读取所有字符并用适当的参数替换%
,直到它遇到NULL字符