我有一些与此代码相关的问题。printf的参数类型为const char*和... (变量参数列表)。
1)为什么程序的输出是d而不是127
2)是否将+1转换为字符串并传递给const char*类型的参数变量?
#include<stdio.h>
int main()
{
printf("%d"+1 , 127); //how this will get executed?
return 0;
}输出:
d发布于 2018-06-06 21:11:42
第一个参数是指向char的指针。
文字"%d"将是指向'%'的指针,该指针后面是'd'和'\0'。它是指向char的指针,因为它是字符串文本的C表示:字符序列,末尾有一个'\0';作为参数表示,等等,作为指向char的指针。
但是,根据指针算法,"%d"+1是指向'd'的指针,其次是'\0'。
两者都是以零结尾的,适合于printf的参数。
因此,输出与
printf("d", ignored);127变成“忽略”,即它被忽略了,因为"d"告诉printf不要期望任何东西,因为它没有任何特殊的字符序列,例如"%someletter“。因此,它不会期待,不会寻找任何东西,也不会做任何印刷,除了它认为已经给出的完全正常的字符串。
但是,请注意,其他参数(那些没有包含在格式字符串中的参数)确实得到了计算,然后忽略了。这是相关的,因为评估的任何副作用(例如函数调用)实际上都会发生。
详见此处:
发布于 2018-06-06 23:00:36
让我尝试帮助并添加到@Yunnosch的回答中,您可以这样做:
char *str = "%d";
printf (str, 127);产出应是:
127在上面的示例中,str像这样存储在内存中(这只是一个例子,现实生活中的地址类似于0xabc def12345678):
address | memory
--------+--------------
0 | %
1 | d
3 | \0因此,str指向包含%的address 0 (或您系统上的等效地址),printf()获取该地址并从那里开始读取,读取直到到达空字符'\0‘。现在,每当它看到%时,它就查找下一个字符d、c、x等等,它从参数列表中读取下一个参数。如果您提供了d,它将输出十进制,如果您提供c,它将打印字符,x用于十六进制,还有更多。因此,printf()将读取所有字符并使用适当的参数替换%<place holder>,直到它到达空字符\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不会转换成字符串,它们会被添加到字符串的地址中。
我希望这能帮上忙,我想我已经回答了你们的两个问题。
https://stackoverflow.com/questions/50729625
复制相似问题