请解释以下C程序的输出。

时间:2017-07-20 22:03:20

标签: c arrays string operators

  

任何人都可以逐步解释以下代码的工作原理吗?

#include<stdio.h>
main()
{
    char s[ ]="Hello";
    int i;
    for(i=0;s[i];i++)
    printf("%c%c%c%c\t",s[i],i[s],*(s+i),*(i+s));
}
  

我的输出为“HHHH eeee llll llll oooo”,但我无法理解它的工作原理。

2 个答案:

答案 0 :(得分:3)

如果你有一个存储像这样的字符串的字符数组

char s[ ]="Hello";

然后例如表达式s[0]从字符串中产生字符'H'

此表达式s[0]等同于表达式0[s]*( s + 0 )*( 0 + s )

即输出你可以写的字符串的第一个字符

printf( "%c", s[0] );

printf( "%c", 0[s] );

printf( "%c", *( s + 0 ) );

printf( "%c", *( 0 + s ) );

来自你的程序的声明

printf("%c%c%c%c\t",s[i],i[s],*(s+i),*(i+s));

在一个陈述中展示了所有这些可能性。

来自C标准(6.5.2.1数组下标)

  

2后缀表达式后跟方括号[]中的表达式   是数组对象元素的下标。的的   下标运算符[]的定义是E1 [E2]与...相同   (*((E1)+(E2)))。由于适用于的转换规则   binary +运算符,如果E1是数组对象(等效于指针   到数组对象的初始元素),E2是一个整数,   E1 [E2]表示E1的第E2个元素(从零开始计数)。

还要注意报价的这一部分

  

后缀表达式后跟方括号中的表达式   [] ...

它允许编写像i++[s]这样的表达式,因为i++是一个后缀表达式。

考虑以下示范程序

#include <stdio.h>

int main(void) 
{
    char s[] = "Hello";

    int i = 0;

    while ( *( s + i ) )
    {
        printf( "%c", i++[s] );
    }
    putchar( '\n' );

    return 0;
}

它的输出是

Hello

答案 1 :(得分:2)

你有一个字符数组“Hello”。

对于数组中的每个字符,由i指定的索引(直到字符串结尾时字符== 0因此为false)输出由以下内容组成的字符串:

  1. 当前字符(s [i])
  2. 由i标识的内存位置处的字符+字符串开头的内存偏移量
  3. 通过将索引(i)添加到字符串开头的内存位置而构造的指针处的字符
  4. 通过将字符串开头的内存偏移量添加到索引构造的指针处的字符。
  5. 这4个操作都指向内存中的相同字节,因此字符重复4次。这是一个练习,演示了C语言如何直接访问内存以及如何操作指针,指针算法可用于访问数组的内容,相反,数组变量可用于指针算法。