はじめに
やさしいD言語クイズ
の第2弾です。
第1弾から、読んでいただけると幸いです。
問題4
ソースコードをコンパイル、実行すると、どのような出力結果になるでしょうか。
import std;
void main()
{
int[] a = [1, 2, 3];
int[] b = a;
int[] c = a.dup;
int[] d = a ~ [];
int[3] e = a;
a[1] = 5;
writeln(a[1], b[1], c[1], d[1], e[1]);
}
問題5
ソースコードをコンパイル、実行すると、どのような出力結果になるでしょうか。
import std;
void main()
{
try {
try {
write("1");
throw new Exception("2");
} finally {
write("3");
throw new Exception("4");
}
write("5");
} catch (Exception e){
write(e.msg);
}
try {
write("6");
goto L1;
} finally {
write("7");
}
write("8");
L1:
write("9");
}
問題6
ソースコードをコンパイル、実行すると、どのような出力結果になるでしょうか。
import std;
void func1(char b){
write(1);
}
void func1(int b){
write(2);
}
void func1(long i)
{
write(3);
}
void func2(byte b){
write(4);
}
void func2(int i)
{
write(5);
}
void main()
{
func1(0x61); // 0x61 = 'a'
func1('a');
func1(1L);
func2(1L);
}
ここから回答編です。ネタばれ注意!!
問題4の答え
問題4の実行結果
問題4の実行結果
55222
シャローコピー、ディープコピーについては、D言語の配列コピーでの注意点にも書きています。参考までに。
答えの補足
-
b
はシャローコピーです。a
と同じ内容を指しています。 -
c
はdup
を使っているので、ディープコピーです。 -
d
は配列の結合結果を代入します。配列の結合処理時に新たに領域を確保するため、ディープコピーになります。
言語仕様によると、空の配列との結合処理であってもディープコピーとなります。 -
e
は静的配列への代入のため、ディープコピーになります。
問題5の答え
問題5の実行結果
問題5の実行結果
132679
答えの補足
-
Exception("2")
が発生しますが、catch
より先にfinally
ブロックが処理されます。 - ただし
4
は出力されません。Exception
が起因でfinally
ブロックに入る場合は、finally
ブロック内にあるException
は処理されず、フォールスルーされる仕様のためです。 -
try
ブロック内でgoto
でのジャンプが発生しても、finally
ブロックは処理されます。
問題6の答え
問題6の実行結果
問題6の実行結果
2134
答えの補足
-
0x61
は、int
型の定数です。 -
'a'
は、char
型の定数です。 -
1L
は、long
型の定数です。 -
func2(1L)
についてはfunc2(long b)
が存在しません。オーバーロード関数に合致する型がない場合の言語仕様は、 - 引数の型変換を行うことで関数を利用可能か、コンパイラがチェックします。
- チェックした結果、複数の関数が利用可能であれば、利用可能な範囲が狭い関数が選択されます。
-
byte
の利用可能範囲は-128~127
(8bit符号付き)、int
の利用可能範囲は、-2,147,483,648~2,147,483,647
(32bit符号付き)のため、利用可能範囲が狭いfunc2(byte b)
が呼び出されます。
最後に
時間ぎりぎりまで問題を考えましたが、今回はここまでです。
来年の今ごろに、より面白い問題が作れるよう、言語仕様の勉強を続けようと思います。