SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

突然ですがクイズです!(AD)

突然ですがクイズです!-その2

Delphi、C++、Java、C#、PHP、Rubyの6言語の動作の違いをクイズで考察

  • このエントリーをはてなブックマークに追加

ビット演算と…

問題

 次は、ビット演算について。テストコードを6つの言語で書いてみましたが、今回もやはり1つだけ出力結果が違うものがありました。それはどれでしょうか?

Delphi
program Project1;
{$APPTYPE CONSOLE}
var
  a: Integer;
begin
  a := 2 and 1 shl 1;
  Write(a);
end.
C++
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  int a = 2 & 1 << 1;
  cout << a;
  return 0;
}
Java
package project1;
public class Project1 {
  public static void main(String[] args) {
    int a = 2 & 1 << 1;
    System.out.print(a);
  }
}
C#
namespace project1 {
public class Project1 {
  public static void Main() {
    int a = 2 & 1 << 1;
    System.Console.Write(a);
  }
}
}
PHP5
<?php
$a = 2 & 1 << 1;
echo $a;
?>
Ruby
a = 2 & 1 << 1
print a
解説

 正解は「Delphi」。

 Delphiだけが「0」を出力し、それ以外の言語は「2」と出力します。実は今回のコード、ビット演算自体に問題がある訳ではありません。普通に考えると、「まず2と1のANDは0、次にその0を1ビット左にシフトして…やはり0」という結果が得られると思いがちですが、演算子には優先順位があります。

 問題のコードのように評価する順序を明示的に示していない場合、優先順位が高いものから順に評価されます。Delphi以外の言語では、ビットシフトの演算子「<<」の方が優先順位が高く、先に評価されます。一方Delphiでは「and」と「shl」は順位が同じであるため左から順に、つまり「and」が先に評価されます。このようなうっかりミスを防ぐためにも、言語の種類に限らず「(…)丸括弧」を明示的に指定すべきでしょう。

Delphiの例
a := 2 and (1 shl 1);
C++の例
int a = 2 & (1 << 1);

次のページ
コンストラクタの連鎖とデフォルト引数

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
突然ですがクイズです!連載記事一覧
この記事の著者

EDN編集部(イーディーエヌ編集部)

エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2297 2008/08/20 13:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング