[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:15970] Re: Question about C



> kohda>   envja = getenv("LANG");
> kohda>   if (strcmp(envja, "ja_JP.ujis") == 0)
> kohda> 
> kohda> は効くのに
> kohda> 
> kohda>   if ( envja == "ja_JP.ujis" )
> kohda> 
> kohda> だと効いてないようなんですが何故でしょう。
> 
> たとえば int の配列同士を == 演算子で比較できるでしょうか?
> Cで文字列はcharの配列で表現しています。

えーと、この説明だと意味不明なんじゃないかな。

strcmp(envja, "ja_JP.ujis")は、envjaが指している文字列の中身
と、"ja_JP.ujis"という文字列定数の中身を比較しています。

envja == "ja_JP.ujis"は、envjaが保持しているアドレスと、
"ja_JP.ujis"という文字配列の先頭番地が等しいかどうか、すなわ
ち、まったく同じオブジェクトかどうかを調べています。


例えば、
    char a[] = {"abc"}, *p = a;
    char b[] = {"abc"}, *q = b;
と定義した場合、pの指している文字列とqの指している文字列の中
身は一致しますから、strcmp(p, q) == 0です。
一方、pとqは違う値を持ちますから、p != qです。

Lisp風に言うと、strcmp(p, q)はpとqがequalかどうかを調べてい
て、p == qはpとqがeqかどうかを調べています。eqならばequalで
すが、その逆は真ではありません。

-- 
川村 尚生