int a = 10;

id:kagamihogeさんのエントリに便乗するのだが、最近勉強会用に調べ物をしたことが関係あるので書いておく。a = 10;の意味がわからない人は確かにいる。これって抽象的な考え方ができないのだろうとおもふ。
□ + 5 = 10
の虫食い算はいいのにこれが
x + 5 = 10
だととたんにだめになるようなものだろう。アセンブラ高級言語の一番大きな飛躍は「オブジェクト*1に名前をつけ名前で扱う」点にあると思う。

もう一つ、わかっている人が無自覚でいることが左辺値と右辺値の違いだと最近気がついた。

int a;
a = a + 5;

の左辺のaは左辺値だが右辺のaは右辺値だ。左辺値は値を格納する箱を表現しているが右辺値は箱に格納された中身を表している。これにポインタが絡むとポインタの値は箱を指すものとなり、そこから間接参照して箱の中身を取り出すことになる。抽象度が1階層深くなる。

数学の成績とプログラムはそんなに関係ないという人がいる。確かに直接は関係ないのだけれど、数学が嫌いな人って抽象化が苦手な気がする。ポインタや再帰は抽象的な考え方ができないと理解できないのだろうと思う。

C言語の起源を調べているとCの元になったBではポインタと整数の区別がなかった。ほとんどの演算子は変数を整数として扱い、一部はポインタとしてあつかった、というのは右辺値と左辺値のことを考えれば自然なことだ。とにかく名前をつけて名前で扱う、それは変数だろうが、関数だろうがとにかくオブジェクトとしてまとまった一つの固まりのように考え扱う。プログラマになれるかどうかはそこが境目だろう。

*1:C言語で言うオブジェクトは「オブジェクト指向」のオブジェクトとは違う。「メモリ上に配置されているもの」なのでインスタンスが近い