有人可以向我解释给定代码中发生了什么吗?

时间:2013-03-28 23:18:47

标签: c io printf

   #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

我无法跟踪程序在这里实际执行的操作,或者编译器的工作方式。

3 个答案:

答案 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]ms[9]s[1]都是hm - h为5. s[5]k中的chomskys + 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()函数时,它会将该地址的字符串打印到字符串的末尾。