【问题标题】:Please explain the output of the following C program. [closed]请解释以下 C 程序的输出。 [关闭]
【发布时间】:2017-07-20 22:03:19
【问题描述】:

谁能一步步解释以下代码的工作原理?

#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”,但我无法理解它的工作原理。

【问题讨论】:

标签: c arrays string operators


【解决方案1】:

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

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)))。 因为适用于 二进制 + 运算符,如果 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

【讨论】:

    【解决方案2】:

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

    对于数组中的每个字符,由 i 指定的索引(直到字符 == 0 并且因此为假时字符串的末尾)输出一个由以下组成的字符串:

    1. 当前字符 (s[i])
    2. 由 i 标识的内存位置处的字符 + 字符串开头的内存偏移量 (s)
    3. 通过将索引 (i) 添加到字符串 (s) 开头的内存位置构造的指针处的字符
    4. 通过将字符串开头的内存偏移量添加到索引构造的指针处的字符。

    这 4 次操作都指向内存中的同一个字节,因此该字符重复了 4 次。这是一个练习,演示了 C 语言如何直接访问内存以及如何操作指针,指针运算可用于访问数组的内容,反之,数组变量可用于指针运算。

    【讨论】:

    猜你喜欢
    • 2015-12-07
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2014-02-15
    相关资源
    最近更新 更多