確かに「値が変わるのにconstって、なんだかなあ」と私も思います。

kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> const ってのは、この場合は、「代入しない」っていうプログラマ
> 向けの宣言なのかな。「僕は馬鹿だから代入するかも知れないので、
> ここで const って付けておこう」ってな感じ? 

「代入しない」ってことでしょうね。「僕は」じゃなくて、他人が書いたプロ
グラムを使う時の方が重要でしょうけど。

プロトタイプに、
   int strcmp(char const *, char const *);
と書いてあれば、使う側では「ああ、strcmpは、渡した文字列に代入しないん
だな」と分かる。

> それとも、コンパ
> イラの方で const がついていると良いことがあるのかな。

それもあるでしょうね。
  char a[100], b[100];
  int i;
  ...
  ... a[0]への参照 ...;
  strcmp(a, b);
  ... a[0]への参照 ...
でstrcmpから返った時、a[0]をロードし直す必要はないとか。

> ついでに、Linux kernel なんですけど、
> 
>    extern __inline__ ....
>         __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*ad
> dr));
> 
> ここの volatile はなんで必要なんでしょう? inline 関数の多重
> 呼出しがあった時に一つにしてはいけないっていうコンパイラ向け
> の宣言かな? 

gccのasm volatileってのは「outputを使わないときでも、この命令を削除す
るな(outputの他に副作用がある)」という意味ですよね。

http://gcc.gnu.org/onlinedocs/gcc-3.4.2/gcc/Extended-Asm.html

上の例はよく分かってませんが、「読み込む」動作そのものが必要な時(デバ
イスのポートとか)があるんじゃないでしょうか。

> どうも、なんか、const も volatile も restrict も、誰に向けた
> 宣言か良くわからなくって、adhoc な感じがして好きになれない...

staticやexternも、なんか良く分からんですよね。記憶域の話だったりスコー
プの話だったり。

まあ、constやrestrictは、効率を気にしないなら、よく理解しないでもコン
パイラのいう通りにつけておいて問題ないですし、volatileはデバイスドライ
バ書くような人しか縁がないでしょうけど、staticやexternは教える時に困る。

「どうしてヘッダに関数プロトタイプ宣言を書く時はexternつけなくてよいの
に、変数宣言だとつけなきゃいけないんですか?」とか。
「staticは、静的な記憶域だと習いましたけど、じゃあ
static int foo(void);
ってどういう意味ですか?」とか。

                                前田敦司