3
   #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

我无法跟踪程序在这里实际在做什么,或者更确切地说是编译器是如何工作的。

4

3 回答 3

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
于 2013-03-28T23:23:42.250 回答
3

s[3]ms[9]并且s[1]都是hm-h是 5. s[5]kchomsky. s + s[3] - s[9]是从ins + 5开始的字符串。 kchmosky

于 2013-03-28T23:23:05.237 回答
3

C 中的char类型也可以视为整数类型。

s是指向字符串中第一个字符的指针。 s[3]-s[9]减去第 3 位字符和第 9 位字符的ASCII码并返回一些数字。

稍后,该数字被添加到指向字符串 ( s+s[3]-s[9]) 中第一个字符的指针,并导致地址位于字符串开头之后的 5 个位置上。

当您将该地址传递给printf()函数时,它会从该地址打印字符串到字符串的末尾。

于 2013-03-28T23:32:02.460 回答