为什么这样做?阵列访问不正常
Why does this work? Illogical array access
我的一个朋友第一次学习C++,给我发了一段代码:
int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 };
char bar[] = " abcdefghijklmnopqrstuvwxyz01234567890+-,.!?-_";
for (int i = 0; i < 10; ++i) {
std::cout << foo[i][bar];
}
乍一看,我告诉他它不起作用——我认为它不会编译,或者至少会导致访问违规,因为foo
不是二维数组,他回答说它是二维数组。
我自己试了一下,令我惊讶的是,这个片段运行得非常好。问题是:为什么?
根据逻辑、常识和良好实践,语法应该是bar[foo[i]]
。
我很惭愧地承认,我不知道发生了什么。是什么让foo[i][bar]
在这种情况下成为有效语法?
简单地说,在C中(以及在C++中,当[]
未过载时)对数组元素的访问如下:
x[i] = *(x + i)
所以,有了这个和一点算术。。。
foo[i][bar]
= (foo[i])[bar]
= (*(foo + i))[bar]
= *((*(foo + i)) + bar)
= *(bar + (*(foo + i)))
= bar[*(foo + i)]
= bar[foo[i]]
不过不要用这个"事实"。正如您所看到的,它使代码不可读,而不可读的代码是不可维护的。
相关文章:
- C++中的memset函数工作不正常
- 通用线程池类工作不正常
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 名为DLL的C++windows服务程序工作不正常
- C++-循环中的If语句工作不正常
- While循环和if/else语句工作不正常
- 多重继承和访问不明确的元素
- 访问不同类的私有结构体成员
- Qthread ::更改系统时间时睡眠不正常
- 阵列中的元素不正常地变化
- C++:最大数组值函数工作不正常
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 在C++/虚幻引擎4中访问不同类中的静态变量
- Qt QGraphicsSceneMouseEvent 访问不完整类型
- 就SFINAE而言,访问不存在的成员不被视为"error"吗?
- C++ Qt4.8 :: 将对象传递给另一个类 - 成员访问不完整类型错误
- 工会工作不正常
- C++:错误:成员访问不完整的类型,未使用的参数[-Werror,-Wunused-parameter]
- 为什么这样做?阵列访问不正常