在输出printf语句时遇到麻烦

时间:2019-07-02 15:44:54

标签: c printf pointer-arithmetic post-increment

我在理解以下代码段的输出时遇到了一些麻烦。

#include<stdio.h>
int main()
{
    char *str;
    str = "%d\n";
    str++;
    str++;
    printf(str-2, 300);
    return 0;
}

代码的输出为300。

我知道直到printf语句之前的行,str都指向字符-%。我需要帮助的是了解为什么printf功能打印300。

2 个答案:

答案 0 :(得分:5)

printf之前,str不是指向%,而是指向\n

++运算符使str的值递增以指向数组中的下一个字符。由于此操作已完成两次,因此它指向\n。然后,将str-2传递到printf时,它将创建一个指向%的指针。因此printf看到了字符串"%d\n",该字符串导致按预期方式打印300。

答案 1 :(得分:3)

2 - 2等于0。:)

实际上这两个表达式语句

str++;
str++;

可以像

那样重写
str = str + 1;
str = str + 1;

等同于一条语句

str = str + 2;

然后在带有printf的语句中

printf(str-2, 300);

您正在使用表达式str-2指向字符串文字"%d\n"的第一个字符,或者表达式str-2的值等于{{1}的原始值}。

(您还记得str吗?)

所以上面的陈述等同于

2 - 2 == 0

最初由字符串文字printf(str, 300); 初始化str