TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【トリッキーなコード】配列の添字演算子[]をトリッキーに扱う裏技 (C言語)

配列の添字演算子[]をトリッキーに扱う裏技をご紹介します。

以下のコードを見てください。
1 : #include <stdio.h> 2 : 3 : int main(void) 4 : { 5 : char * p = "ABCDEF"; 6 : 7 : printf("%c\n", 3["abcdef"]); 8 : printf("%c\n", 2[p]); 9 : puts(&1[p]); 10 : 11 : return 0; 12 : }
なんじゃこりゃ?!こんなコード動くのか?? と思わず唸ってしまいそうですが、 実はこのコード、正常に動作します^^;) 実行結果) 配列の添字演算子[]をトリッキーに扱う裏技 - (C言語) それでは説明に移ります。 Cコンパイラでは、配列arrと添字iに対して、arr[i] は *((arr) + (i)) として解釈 されます。 従って配列の添字演算子[]の二つのオペランドは交換可能 であり、 arr[i]と書いても i[arr]と書いても同じ意味になります。 ・・・たった3行の説明ですが、初めてこの交換法則を知った人は、非常にビックリしたのではないでしょうか??^^;) この法則を踏まえて冒頭のコードを読んでみると、 7行目の
printf("%c\n", 3["abcdef"]);
printf("%c\n", "abcdef"[3]);
と同義になり、「d」が表示されます。(← 配列は0-baseである事に注意) 同様に8行目の
printf("%c\n", 2[p]);
は、
printf("%c\n", p[2]);
と同義になり、「C」が表示されます。 9行目の
puts(&1[p]);
puts(&p[1]);
と同義になり、p[1]のアドレスをputs()関数に渡している為、"ABCDEF"の2文字目からが表示されます。
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ