【ポインタ】C言語の小ネタ

Twitterで以前出題したこの問題。
わりと反響をいただいたのでブログにも書こうと思います!

【問題】
以下のC言語で書かれたプログラムを実行すると、なんと表示されるでしょうか?

#include <stdio.h>

int main(void){
    int list[4] = {1,2,3,4};
    printf("%d\n",0[list]);
    return 0;
}

「実行すれば分かるでしょ」
….その通りです笑

少し考えれば分かるかも…?

しかしながら知らない人は「そんな書き方ないだろ!」「考えるだけ時間の無駄だ!」と思うかもしれません。

確かに。
それでは実際に実行してみましょう!

今回はオンラインで簡単にプログラムを実行できるpaiza ioを使って実行してみたいと思います!
paiza ioのリンクを貼っておきます。

<リンク>
https://paiza.io/ja/projects/new

ここに先ほどのCプログラムを貼り付けます。
左上に丸いボタンがありますが、これをクリックして「C」に変更しておきましょう。

paiza ioの画面

貼り付けができたら下の「実行」ボタンを押して実際に動かしてみましょう!
ポチッとな!!

…..できたでしょうか?
しっかりとコピペできたならば通ったと思います。さて、実行結果を見てみましょう!

プログラムの実行結果

出力は「1」になっています!これは「list[0]」の場合と同じ出力です。
では5行目の「0[list]」を「3[list]」にしたらどうなるでしょうか?

さっそく試してみましょう!
プログラムの5行目を書き換えて「3[list]」にします。

プログラムを書き換えたら先ほどと同じく「実行」ボタンを押してプログラムを動かしてみましょう!

先ほどと違い、「4」と出力されましたね!
これは「list[3]」と同じ出力になります。

だいたい分かってきたでしょうか?配列名(ここではlist)と添え字は逆転させても同じ表示になるんです!

これは一時期学生プログラマ界隈で流行ったネタですね!
C言語のポインタの仕様でこういったことが可能になります。

糖衣構文の「ポインタへの配列風アクセス」の中でも説明されているのでぜひ見てみてください!
https://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3%E6%A7%8B%E6%96%87

「添え字と配列名を反対にして書くことができる」とはいっても、可読性が落ちますので、普段のプログラムでは使用しないようにしましょう笑