#include<stdio.h>
int main()
{
char s[]="chomsky the great";
printf("try0 %s\n",s+s[3]-s[9]);
printf("try1 %s\n",s+s[3]-s[1]);
return 0;
}
gcc编译器中的o / p是
try0 ky the great try1 ky the great
我无法跟踪程序在这里实际执行的操作,或者编译器的工作方式。
答案 0 :(得分:4)
s+s[3]-s[9] = s + *(s+3) - *(s+9) = s + 'm'- 'h' = s + 109 - 104 = s + 5 = s[5]
因此printf开始在s [5]
打印printf打印的例子:
printf("%s",s) = chomsky the great
printf("%s",s[0]) = chomsky the great
printf("%s",s[2]) = omsky the great
printf("%s",s[5]) = ky the great
答案 1 :(得分:3)
s[3]
是m
。 s[9]
和s[1]
都是h
。 m
- h
为5. s[5]
是k
中的chomsky
。 s + s[3] - s[9]
是s + 5
,这是从k
chmosky
开始的字符串。
答案 2 :(得分:3)
C中的char
类型也可以像整数类型一样对待。
s
是指向字符串中第一个字符的指针。
s[3]-s[9]
将第3个字符的ASCII代码和第9个字符的代码减去并返回一些数字。
稍后该数字将添加到指向字符串中第一个字符的指针(s+s[3]-s[9]
),并产生超出字符串开头5个位置的地址。
当您将该地址传递给printf()
函数时,它会将该地址的字符串打印到字符串的末尾。