C 关于printf语句的输出有问题

C 关于printf语句的输出有问题,c,printf,pointer-arithmetic,post-increment,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。就在printf之前,str不是指向%而是指向\n ++运算符

我在理解以下代码段的输出时遇到一些问题

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

我知道直到printf语句前面的一行,str都指向字符-%。我需要的帮助是理解为什么printf函数打印300。

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

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

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

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

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的值等于str的原始值

你还记得2-2==0吗

所以上面的陈述相当于

printf(str, 300);
当str最初由字符串文本%d初始化时\n

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的值等于str的原始值

你还记得2-2==0吗

所以上面的陈述相当于

printf(str, 300);

当str最初由字符串文本%d初始化时\n

No,在printf语句str指向换行符之前。我不确定此语句在做什么:printfstr-2300;但是,第一个参数应该是格式字符串。第二个和以下参数是要在格式字符串中提供给输出格式说明符的值。然而,在printf语句str指向换行符之前,为stringNo格式引用一些变量被认为是一种安全风险;但是,第一个参数应该是格式字符串。第二个和以下参数是要在格式字符串中提供给输出格式说明符的值。但是,为格式字符串引用某些变量被认为是一种安全风险