文字列(String)の比較
ものすごく久しぶりにまともなブログ。
プログラミングについて、自分用メモも兼ねて書いておこうかと。
凄く基礎的な事なのに、今更しったよ…。
何気にPHPの勉強してる時にちゃんと説明してくれてる資料がなかったような…。俺が見落としてただけ?
まず、現在勉強中のJavaの場合。
class test{
public static void main(String args[]){
/* Integer型の場合 */
int i1 = 100;
int i2 = 100;
int i3 = 10;
iHikaku(i1, i2); // TRUE が表示される
iHikaku(i1, i3); // FALSE が表示される
iHikaku(i3, 10); // TRUE が表示される
/* String型の場合 */
String s1 = "abc";
String s2 = "abc";
String s3 = "xyz";
// ↓TRUE が表示されるが場合によってうまく比較できないので好ましくない
if(s1 == s2){
System.out.println("TRUE");
}else{
System.out.println("FALSE");
}
sHikaku(s1, s2); // TRUEが表示される
sHikaku(s1, s3); // FALSEが表示される
sHikaku(s3, "xyz"); // TRUEが表示される
}
/* Integer型比較メソッド */
private static void iHikaku(int i1, int i2){
if(i1 == i2){
System.out.println("TRUE");
}else{
System.out.println("FALSE");
}
}
/* String型比較メソッド */
private static void sHikaku(String s1, String s2){
if(s1.equals(s2)){
System.out.println("TRUE");
}else{
System.out.println("FALSE");
}
}
}
PHPの場合。
$a = 100;
$b = "100a";
$c = "100";
echo hikaku1($a, $b) . "<br />\n"; // TRUE
echo hikaku2($a, $b) . "<br />\n"; // FALSE
echo hikaku3($a, $b) . "<br />\n"; // FALSE
echo hikaku1($a, $c) . "<br />\n"; // TRUE
echo hikaku2($a, $c) . "<br />\n"; // FALSE
echo hikaku3($a, $c) . "<br />\n"; // TRUE
/* ==演算子で比較 */
function hikaku1($x, $y){
if ($x == $y){
return "「TRUE」";
}else{
return "「FALSE」";
}
}
/* ===演算子で比較 */
function hikaku2($x, $y){
if ($x === $y){
return "「TRUE」";
}else{
return "「FALSE」";
}
}
/* strcmp関数で比較 */
function hikaku3($x, $y){
if (strcmp($x,$y) == 0){
return "「TRUE」";
}else{
return "「FALSE」";
}
}
いずれの言語の場合も、==演算子を使って文字列を比較すると変な挙動があるらしい。
Javaの場合は、equals()メソッドを使う事でOK。ちなみに変数の順番はどちらでも同じ。
PHPの場合は、==で比較するとなんと100と”100a”が同じとされてしまう。==演算子は数字の部分しか見ていないらしい。
===演算子を使う事で厳密に比較できるが、今度は厳密すぎて100と”100″が別の物として扱われる。これはstrcmp関数を使う事で回避できる。
ちなみに===演算子は1や”1″とboolean型のtrueを比較する時とか役にたつか名、
PHPは変数の型の定義をしなくて済むから楽だけど、こういう時に何かとややこしくなっちゃうね。まぁその代償って所かな。
そんな感じ。
No related posts.

コメントはまだありません。