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);
}
Run Code Online (Sandbox Code Playgroud)
打印相同的输出:- 51 51
但是在 swift 中为什么不能更改数组名称及其索引的位置?`
原因:数组在 C 中不是一流的数据类型,但在其他语言中却是。
因为 C 不支持数组作为完整的本机类型,数组访问转化为指针 math,因此arr[ix]由语言定义为*(arr + ix),这与*(ix + arr)plus相同,ix[arr]因为所有都完全等效。
它不打算,你不喜欢愚蠢的ç技巧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;
}
Run Code Online (Sandbox Code Playgroud)
这是完全合法且由语言明确定义的,但呼应了我的一位同事的情绪,父亲原谅我,因为我犯了罪。:-)
正如史蒂夫弗里德尔所说,这只是array[i]等同于的定义的巧合副作用*(arr + i)。虽然不一定是错误,但它并不是真正的功能,因为拥有它并没有真正得到任何好处。
由于没有理由支持这一点,大多数语言都不会费心去实现它。
Swift 有扩展,所以你可以实现这个语法,但亲爱的上帝,不要这样做。
extension Int {
subscript<T>(array: [T]) -> T {
return array[self]
}
}
let a = [33, 19, 13, 25, 51]
print(a[4]) // => 51
print(4[a]) // => 51
Run Code Online (Sandbox Code Playgroud)
父亲原谅我,因为我犯了罪。