C程序Strings例子结果怎么是98?

C program Strings Example how come the result is 98?

C 程序字符串示例结果怎么是 98?

 #include <stdio.h>
int main() 
 {
  char s[]="%d%d%d";
   int a=9,b=8,c=5;
     printf(s+2,a,b,c);
    return 0;
     }

表达式s+2 在图像中说话将指针 s(在表达式中数组指示符被转换为指向其第一个元素的指针)向右移动两个位置。所以 printf 语句中的格式字符串看起来像

"%d%d"

因为表达式s+2指向字符串的第三个字符"%d%d%d" 结果语句

printf(s+2,a,b,c);

将仅输出两个第一个参数 a 和 b,因为指向的子字符串仅包含两个格式说明符,您将得到

98

例如,如果您在 printf 调用中使用表达式 s + 4,您将只得到

9

string + x 是一个名为 Pointer Arithmetic 的操作。 这样您就可以提供对数学计算的内存区域的引用,并且在语义上它等同于 &string[x] 计算背后实际发生了什么: (&string + (x * sizeof(*string))) 这就是为什么它在应用于指针时是一个非常具体的概念。这代表数组,毕竟它们会衰减到指向第一个元素的指针。


至于您的代码,您有以下字符串:

char s[]="%d%d%d";

并作为 printf 的格式字符串传递,后两个字节,明确提供对 "%d%d"

的引用

因此:

printf(s+2,a,b,c);

稍后解析为:

printf("%d%d",a,b,c);

printf 除了要读取的两个整数外,第三个整数将被忽略。