为什么这个C数组引用看起来不正确?

bub*_*ble 12 c

下面是从网站复制的一段代码.为方向设置的值从"nsew"打印相应的字符.例如,此代码的输出是字符w.

我想知道它是如何工作的.

#include<stdio.h>
void main (void){
   int direction = 3;
   char direction_name = direction["nsew"];
   printf("%c",direction_name);
}
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 17

这是因为数组下标运算符是可交换的,即:

const char *p = "Hello";
char x = p[0];
Run Code Online (Sandbox Code Playgroud)

相当于

const char *p = "Hello";
char x = 0[p];
Run Code Online (Sandbox Code Playgroud)

很奇怪,是吗?在您的情况下,您将索引到字符串文字的第三个位置(这是一个数组)"nsew".

some_ptr[n]相当于*(some_ptr + n),并且由于加法是可交换的,它也相当于*(n + some_ptr).然后,n[some_ptr]它也是一个等价的表达式.

我不建议使用这个"功能"但是......严肃地说,不要这样做.

  • +1 for*我不建议使用此"功能"但* (5认同)
  • "联想"你的意思是"交换"吗? (2认同)
  • @JuanMendes:在[IOCCC]之外(http://www.ioccc.org),没有.你*应该*在生产代码中永远不会看到这一点. (2认同)

Ros*_*ost 8

运算符[]与指针算术具有相同的语义.所以a[i]等同于*(a + i),相当于*(i + a)这相当于i[a]:

所以direction["nsew"]== "nsew"[direction]== "nsew"[3]=='w'