bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

文字列の比較

せっかくなので、別の問題にもコメント。(こっちはちょっと真面目?w)

1. str1, str2が文字列だとして、if (str1 == str2)と書いてしまうのはよく見かけますよね(ある意味、自然だと言える)。Cならstrcmp、Javaならequalsを使え、って教えるでしょうが、その理由とか事情とかを心底納得できるように説明するにはどうしますか。文字列がインターンされていれば、==でもよかったりするし。


Cだと、「比較してるのは文字列ではなく、あくまでchar型のポインタ変数だから」で済んじゃうような気が。
str1とstr2で指されているものを「文字列」とみなしての比較を行う関数strcmpについては、その意味から語っても、実装から攻めてもいいような気がします。
Javaでも割と同じノリじゃないかと。Stringというクラスで扱うようになっていて、「文字列」というものがプリミティブな存在にはなっていないところがポイントでは。"=="は(プリミティブでないオブジェクトが両辺にある場合は)オブジェクトが同じかどうかを判別する演算子なんだ、という事を念頭に置いた説明をすればいいはず。
むしろインターンしてしまっている場合の方が、(特に実装面からは)説明がややこしいのでは。Java

    class StrCmp {
        public static void main(String[] args) {
            String str1 = new String("aaa");
            String str2 = new String("aaa");
            System.out.println(str1 == str2);
        }
    }

というコードと、C#

    class StrCmp {
        public static void Main(string[] args) {
            string str1 = String.Copy("aaa");
            string str2 = String.Copy("aaa");
            Console.WriteLine(str1 == str2);
        }
    }

で結果が違う事を説明するのは難儀ですね。字面が似てるだけに。

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。