首页 > 解决方案 > 为什么不能像 C (a[i] == i[a]) 那样快速交换数组名和索引的位置?

问题描述

C代码:-

#include <stdio.h>

int main()
{
   int a[5]={33,19,13,25,51};
   int t1 = a[4];
   int t2 = 4[a];         // surprise here
   printf("%d\n", t1);
   printf("%d", t2);
}

打印相同的输出:- 51 51

但是为什么不能快速更改数组名称及其索引的位置?`

标签: carraysswift

解决方案


原因:数组不是 C 中的一等数据类型,但在其他语言中它们是。

因为 C 不支持将数组作为完整的本机类型,所以数组访问会演变为指针数学,因此arr[ix]由语言定义为 be *(arr + ix),这与plus完全等价*(ix + arr)的好奇ix[arr]相同。

这并不是你做 Stupid C Tricks 之类47[buffer]的,但这是允许的。

将数组视为一等数据类型的其他语言不需要根据指针数学来定义它们,因此可以原生且完全地支持它们,并且没有理由支持这种奇怪的工件。

在 C 语言中,这是通过询问朋友来愚弄他们的好方法:打印的是什么?

// what is printed?
#include <stdio.h>

int a[] = { 4, 2, 0, 1, 3 };

int main()
{       
    int i = 1[a][a][a][a];  // HUH?

    printf("i = %d\n", i);

    return 0;
}

这是完全合法的,并且由语言明确定义,但与我的一位线程伙伴的情绪相呼应,父亲原谅我,因为我犯了罪。:-)


推荐阅读