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 除了要读取的两个整数外,第三个整数将被忽略。
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 除了要读取的两个整数外,第三个整数将被忽略。