はじめに
やさしいD言語クイズの第4回です。
クイズを通して、D言語の言語仕様を紹介することが目的です。
これをきっかけにD言語に興味を持ってもらえると幸いです。
クイズの前提
D言語コンパイラ DMD v2.106でのコンパイル、実行結果をクイズの正解とします。
問題10
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std;
void main()
{
int a, b, c;
a = b = c = 2;
f(a, b, c);
writeln(a, b, c);
f(a, b, c);
writeln(a, b, c);
}
void f(int a,out int b,ref int c)
{
a++;
b++;
c++;
}
問題11
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std.stdio;
void f(int[] i){
write("1");
}
void f(const int[] i){
write("2");
}
void f(const shared int[] i){
write("3");
}
void f(const inout shared int[] i){
write("4");
}
void f(inout(int)[] i){
write("5");
}
void main(){
int[] i1 = [0];
const(int)[] i2 = [0];
immutable int[] i3 = [0];
shared int[] i4 = [0];
f(i1);
f(i2);
f(i3);
f(i4);
}
問題12
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。
import std;
void main()
{
auto i = ubyte.min;
writeln(i.sizeof);
writeln(i.stringof);
writeln(typeof(i).stringof);
auto s = (++i).stringof;
writeln(i);
}
ここから回答編です。ネタばれ注意!!
問題10の答え
問題10の実行結果
213
214
答えへの補足
関数のパラメータについての問題です。
関数f
のパラメータについて
-
int
型は値渡しのため、main
関数の変数a
に影響を与えません。 -
out int
は参照渡しとなり、関数呼び出し時に初期化(= 0
)されます。
main
関数の変数b
の値に影響を与えます。 -
ref int
も参照渡しとなりますが、初期化を行いません。
main
関数の変数c
の値に影響を与えます。
問題11の答え
問題11の実行結果
1543
答えへの補足
暗黙的な修飾子変換についての問題です。
呼び出し関数に一致する修飾子がない場合は、下図に従って暗黙的に変換されます。
inout
については、以下を参照。
問題12の答え
問題12の実行結果
1
i
ubyte
0
答えへの補足
プロパティについての問題です。
1行目は、変数i
はubyte
型と推論されるので、そのサイズを表示します。
2行目は、変数名そのものを表示します。
3行目は、auto
ではなく、推論された型名を表示します。
4行目は、.stringof
は式の内容を評価しません。つまり(++i).stringof
でi
はインクリメントされません。
参考までに
過去の出題内容はこちらです。