みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

演算子 Ruby認定試験対策問題

Ruby認定試験対策問題をやっていたら分からないところがあったので、
教えてください。

2.4.演算子
■問題
次の各行を独立して実行した場合、エラーとなる行があった。エラーとなった行について正しく述べているのはどれか。
A: 1 << 1
B: 1 << 1.0
C: 1.0 << 1
D: 1.0 << 1.0

■回答
正解は(1)「C行, D行がエラーとなった。」

■解説
Float には、<< 演算子が定義されていません。また、Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。

とあるのですが、問題の意味、なぜ回答が(1)になるか、また、解説の「Integer型に、<< 演算子の引数として、浮動小数点を渡しても」がどの部分を指すのかが分かりません。

自分が調べた限りでは、 << はIntegerクラスのメソッド(シフト演算子)で、ビットを左にシフトするものということだけなのですが……。

この場合、問題の主旨は、例えば「Aだと、1 を 1 ビット左にシフトする」、「Bだと、1 を 1.0 ビット左にシフトする」、「Cだと、1.0 を 1 ビット左にシフトする」という意味なのでしょうか。

また、演算子の引数というのは、<<より右側を指すのでしょうか?

投稿日時 - 2008-11-23 12:00:04

QNo.4500398

暇なときに回答ください

質問者が選んだベストアンサー

まず、1と1.0は違うクラスのインスタンスだということです。
1は、Integer型(を継承したFixnum型)
1.0は、Float型


これを踏まえて4つの例を説明すると以下のようになります。

A: 1 << 1
Integerクラスのインスタンスである1
その演算子(メソッド)<< に引数として
Integerクラスのインスタンスである1を渡す

 Integerクラスの演算子<<は、引数で与えられたビット分だけ自分を左シフトする
 だから、1を1ビット左シフトして結果は2になる。


B: 1 << 1.0
Integerクラスのインスタンスである1
その演算子(メソッド)<< に引数として
Floatクラスのインスタンスである1.0を渡す

 Integerクラスの演算子<<は、引数で与えられたビット分だけ自分を左シフトする
 演算子<<の引数がFloatで与えられた場合は自動的にIntegerに変換される
 すなわち1.0は、1に変換される。
 だから結果はAと同じく2になる。


C: 1.0 << 1
Floatクラスのインスタンスである1.0
その演算子(メソッド)<< に引数として
Integerクラスのインスタンスである1を渡す

 Floatクラスには、演算子<<が定義されていない
 だから、エラーになる。


D: 1.0 << 1.0
Floatクラスのインスタンスである1.0
その演算子(メソッド)<< に引数として
Floatクラスのインスタンスである1.0を渡す

 Cと同じ結果になる。

投稿日時 - 2008-11-23 18:47:40

お礼

■ご回答ありがとうございます。
ひとつひとつ丁寧に(処理結果も含め)、
ご解説いただいたので、
大変分かりやすかったです。

▼その中でも特に下記2点が参考になりました。
▽1と1.0は違うクラスのインスタンスだということ
▽B.演算子<<の引数がFloatで与えられた場合は自動的にIntegerに変換される。すなわち1.0は、1に変換される。だから結果はAと同じく2になる。


ありがとうございました。

投稿日時 - 2008-11-24 11:07:52

ANo.2

このQ&Aは役に立ちましたか?

21人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

回答の(2)以降がないのであれなんですが、
Aが問題ないというのは良いですよね?
Bは、
>Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。
が適用されます。
1 << 1.0 と書くとわかりづらいですが、内部的には
1.<<(1.0) つまり、1というインスタンスが持っているメソッドの呼び出しですので、「引数」という表現がされているのでしょう。
#正確には1が属するクラスのメソッドなのですが略
で、1.<<(1.0)を処理するときに、1.0はIntegerに変換されるのでエラーになりません。

C,Dがエラーになるのは良いですよね?

irb(main):001:0> 1.<<(1)
=> 2
irb(main):002:0> 1<<1
=> 2
irb(main):003:0> 1<<1.0
=> 2
irb(main):004:0> 1<<(1.0)
=> 2
irb(main):005:0>

投稿日時 - 2008-11-23 12:10:56

お礼

ご回答ありがとうございます。

■下記説明箇所、大変分かりやすかったです。
1.<<(1.0) つまり、1というインスタンスが持っているメソッドの呼び出しですので、「引数」という表現がされているのでしょう。

投稿日時 - 2008-11-24 11:00:44

あなたにオススメの質問