LoginSignup
4
0

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

Posted at

はじめに

やさしい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行目は、変数iubyte型と推論されるので、そのサイズを表示します。
2行目は、変数名そのものを表示します。
3行目は、autoではなく、推論された型名を表示します。
4行目は、.stringofは式の内容を評価しません。つまり(++i).stringofiはインクリメントされません。

参考までに

過去の出題内容はこちらです。

4
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
4
0