「D言語」の版間の差分

編集の要約なし
 
=== 文字列の表示の関数 ===
write, writef, writeln, writefln などの組み込み関数で、文字列の表示が可能です。
 
ln がついた関数は、「自動的に末尾に改行を付ける」という意味であり、f がついた関数はC言語と同じように、書式を使って表示するという意味です。例を見てみましょう。
 
;コード例
<syntaxhighlight lang="D">
// writefln
import std.stdio;
 
int a = 7;
 
void main()
{
writefln("変数は%d", a);
}
</syntaxhighlight>
 
;実行結果
変数は7
 
<syntaxhighlight lang="D">
// write および writeln の例
 
基本的には、<code>write, writeln</code> は任意の型を任意の個数取ることができるので、いろいろなものを表示してみるのも面白いでしょう。
 
;コード例
<syntaxhighlight lang="D">
// writefln
import std.stdio;
 
int a = 7;
 
void main()
{
writefln("変数は%d", a);
}
</syntaxhighlight>
 
;実行結果
変数は7
 
=== コメント ===
=== 変数宣言 ===
変数とは、値を格納するものです。
 
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
void main() {
auto a = 2460; // a という変数を初期値2460で初期化
auto b = 48; // b という変数を初期値48で初期化
writeln("a: ", a, " b: ", b); // a: 2460 b: 48
auto c = a - b; // c という変数を初期値 a - b で初期化
writeln("c: ", c); // c: 2412
b = c - 12; // 変数 b に c - 12 を代入する
writeln("b: ", b); // b: 2400
a = a - b; // 変数 a に a - b を代入する
writeln("a: ", a); // a: 60
}
</syntaxhighlight>
 
変数に値を「代入する」という操作によって、変数が格納する値が変化します。代入という操作は、等号 "=" を用いて表します。これは数学の等号とは意味が異なるので、注意が必要です。
 
=== 関数宣言 ===
プログラミングをする際に、決まった同じ処理をしたくなる場合があるはずです。その際にコードを再利用することができるよう、関数というものが備わっています。これも数学の意味での関数とは違って、副作用を持つことができるので、「手続き」としばしば呼ばれます。
 
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
void main() {
show_next(twice(8)); // 1 : 17
int m = 20; // int 型変数を宣言
show_next(twice(m)); // 2 : 41
writeln(m); // 20
writeln(add(m, 32)); // 52
writeln(m); // 20
}
 
// int 型の値を2つ受け取り、int 型の値を返す関数 'add' を宣言する
int add(int n, int m) {
auto result = n + m;
return n+m;
}
 
// int 型の値を受け取り、int 型の値を返す関数 'twice' を宣言する
auto twice(int n) {
return 2 * n;
}
 
int counter = 0;
// int 型の値を受け取り、何も返さない関数 'show_next' を宣言する
void show_next(int n) {
counter = counter + 1;
writeln(counter, " : ", n+1);
}
</syntaxhighlight>
 
関数の宣言方法は、上にある通りです。型をまだ説明していませんが、D言語では、値には常に「型」がついて回るのです。そのため、<code>int</code> (32bitの符号付き整数型) といったものが必要になってきます。変数宣言のときには単に "auto" と書くだけで良かったのは、コンパイラが初期値から型を推論して自動で型をつけてくれたからなのです。実際、関数 <code>twice</code> の宣言は <code>auto</code> と書くことができます。
 
宣言した関数を呼び出すには、<code>f(a, b, c)</code> のように書きます。このとき、カッコの中にある <code>a, b, c</code> といったものを「引数」と呼びます。上のコード例で定義した関数は、<code>main</code> が引数なし、<code>twice, show_next</code> が引数一個、<code>add</code> が引数二個、となっていますね。
 
 
ところで、<code>writeln(m); // 20</code> とありますね。なぜ、これが "20" と表示されるか疑問に思いましたか? 関数に値を渡すとき、特に指定しなければそれは'''値渡し'''になります。値渡しとは、「変数の指す値」を渡し、変数自体の情報は渡さないということです。したがって、上のコード例では、<code>m</code> の値は、<code>twice, add</code> に渡されても変わらなかったのです。
 
では逆に、変数の値を書き換えるようにするためには、どうすれば良いのでしょうか。そのような関数の引数への渡し方を'''参照渡し'''と言います。D言語で参照渡しをする方法は簡単です。例を見てみましょう。
 
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
void main() {
int m = 2;
writeln(successor(m)); // 3
writeln(m); // 3
}
 
// int 型の参照渡し
int successor(ref int n) {
n = n + 1;
return n;
}
</syntaxhighlight>
 
これを実行すると、m の値が変わっていることがわかります。しかし、同じコードでも
<syntaxhighlight lang="D">
successor(successor(m));
</syntaxhighlight>
はエラーになってしまいます。それは、<code>successor</code> の返値が参照渡しできないからです。このコードを意図したように動かすには、
<syntaxhighlight lang="D">
ref int successor(ref int n)
</syntaxhighlight>
と、返値の型にも <code>ref</code> をつければ解決します。
 
=== 式 ===
1,326

回編集