はじめに
前回のクイズには挑戦していただけましたか?
コンピュータに向かわずにコードについて考える訓練は、プログラミングのための思考能力を高めるのにも役立ちます。さあ、今回も、Delphi、C++、Java、C#、PHP、Rubyの6言語を取り上げ、同じような動作を記述していながら、結果が異なるケースを紹介し、言語ごとの挙動の違いを考察していきましょう。
前回の記事
最初のクイズ(割り算)
問題
最初のクイズは割り算に関するものです。6つの言語を使って、きれいに割り切れない割り算「2007÷11÷21」を試してみました。しかし、1つだけ出力結果が違うものがあります。それは、どの言語でしょうか?
program Project1; {$APPTYPE CONSOLE} begin Write(2007 div 11 div 21); end.
#include <iostream> using namespace std; int main(int argc, char* argv[]) { cout << 2007/11/21; return 0; }
package project1; public class Project1 { public static void main(String[] args) { System.out.print(2007/11/21); } }
namespace project1 { public class Project1 { public static void Main() { System.Console.Write(2007/11/21); } } }
<?php
echo 2007/11/21;
?>
print 2007/11/21
解説
正解は「PHP」。
PHPでは、期待した「8」は出力されず、少数点「8.6883116883117」が出力されてしまいます。それ以外の言語では正しく「8」が出力されます。これは一体どういうことでしょうか。
Delphi/C++/Java/C#/Rubyでは結果について特別に意識することはないでしょう。整数同士の割り算の結果、小数点は切り捨てられ、整数値が得られます。しかしPHPでは、整数値同士のであっても割り切れない場合には小数点が返されます。
少数ではなく整数値「8」を取得したい場合には、intへの明示的なキャストが必要になります。以下に示すようなコードにより、期待した「8」が出力されます。
<?php
echo (int)((int)(2007/11)/21);
?>