c - 为什么不能像 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
但是为什么不能快速更改数组名称及其索引的位置?`
解决方案
原因:数组不是 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;
}
这是完全合法的,并且由语言明确定义,但与我的一位线程伙伴的情绪相呼应,父亲原谅我,因为我犯了罪。:-)
推荐阅读
- python - 在 Google Colab 笔记本上运行的以下代码需要解释
- c# - asp.net c#存储过程,当传递参数时,它不起作用,只是对第31行的值进行原始编码有什么解决方案吗?
- python - 如何使用 boto3 将字典列表发送到 cloudwatch
- powershell - Oh-my-posh 主题无法与 Powerline 字体和 ConEmu 一起正常工作
- java - 如何将我的黄瓜项目转换为并行运行?
- typescript - 在浏览器中解析 typescript 模块会产生 404
- java - 搜索具有特定参数计数的方法(在 Eclipse 中)
- angular - Ag-grid 自定义工具提示位置更改
- sql-server - Visual Studio - 派生列 - 目标编辑器 - 为什么可用输入列包括新(派生)列?
- android - SQLite - 基于 UNIX 时间戳按月分组