2012-12-06 19 views
12

以下はwebsiteからコピーされたコードです。 directionに設定された値は、それぞれの文字を "nsew"から出力します。たとえば、このコードの出力は文字wです。このC配列リファレンスが正しく表示されないのはなぜですか?

どのように動作するのでしょうか。配列の添字演算子は可換であるため、これは

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

答えて

17

、すなわち、この:

const char *p = "Hello"; 
char x = p[0]; 

はハァッ、

const char *p = "Hello"; 
char x = 0[p]; 

奇妙に相当しますか?あなたの場合、文字列リテラル(配列)の3番目の位置にインデックスを付けています"nsew"

some_ptr[n]*(some_ptr + n)に相当し、加算は可換であるため、*(n + some_ptr)にも相当します。それに続いて、n[some_ptr]も同等の式です。

しかし、この「機能」の使用はお勧めできません...真剣に、しないでください。

+5

1 *しかし私は、この「機能」を使用してお勧めしません* –

+1

または 'p [0]'は '*(p + 0)'と同じで、 '+'は連想型です。 –

+0

ブライアンのコメントは繰り返されます:これをしないでください。 – msw

8

演算子[]は、ポインタ演算と同じセマンティクスを持ちます。だから、a[i]i[a]に相当する*(i + a)と等価である*(a + i)と同等です:

のでdirection["nsew"] == "nsew"[direction] ==ため"nsew"[3] == 'w'

+1

+1私はこの説明が好きです、少なくとも、狂気への方法があります –

関連する問題