3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

D言語Advent Calendar 2021

Day 19

やさしいD言語クイズ(その2)

Posted at

はじめに

やさしい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と同じ内容を指しています。

  • cdupを使っているので、ディープコピーです。

  • 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)が呼び出されます。

最後に

時間ぎりぎりまで問題を考えましたが、今回はここまでです。
来年の今ごろに、より面白い問題が作れるよう、言語仕様の勉強を続けようと思います。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?