文字列の足し算と比較
問題
次は、文字列の足し算と比較(=、==、===、equals)です、6つの言語で試してみましたが、やはり、1つだけ出力結果が異なるものがあります。どれでしょう?
program Project1; {$APPTYPE CONSOLE} var s1,s2: string; begin s1 := ‘ab’; s2 := ‘a’ + ‘b’; if s1 = s2 then Write(’equal’); end.
#include <iostream> using namespace std; int main(int argc, char* argv[]) { string s1 = "ab"; string s2 = string("a") + string("b"); if( s1 == s2 ) cout << "equal"; return 0; }
package project1; public class Project1 { public static void main(String[] args) { String s1 = "ab"; String s2 = "a" + "b"; if( s1.equals(s2) ) System.out.print("equal"); } }
namespace project1 { public class Project1 { public static void Main() { string s1 = "ab"; string s2 = "a" + "b"; if( s1 == s2 ) System.Console.Write("equal"); } } }
<?php $s1 = "ab"; $s2 = "a" + "b"; if( $s1 === $s2 ) echo "equal"; ?>
s1 = "ab" s2 = "a" + "b" if s1 === s2 print "equal" end
解説
正解は「PHP」。
PHPでは、期待した「equal」は出力されません。それ以外の言語では正しく「equal」が出力され、2つの文字列が等しい内容であることが確認できます。Delphi/C++/Java/C#/Rubyについては特にうっかりミスを起こすことはないでしょう。
PHPでは、文字列同士を結合する演算子は「+」ではなく「.(ドット)」です。問題のコードのように「+」を使用して文字列同士を結合しても特にエラーは発生しません。「.(ドット)」を使うことで期待した「equal」が出力されます。
$s2 = "a" . "b";
なお、Javaでは文字列型を含むクラス型の変数同士の等値性を判定する場合、「==演算子」ではなく「equalsメソッド」を使用します。これとは対照的に、Delphiの「=演算子」、C++の「==演算子」、C#の「==演算子」は、文字列においては変数の参照先を比較するのではなく、文字列の内容の等値性を判定する処理へと置き換えられます。この点、注意が必要です。