import std.stdio;
int main(char[][] args)
{
write("D language");
return 0;
}
文字化けする場合
import std.stdio;
import std.conv : to;
import std.windows.charset : toMBSz;
int main(char[][] args)
{
// 文字化けしない
write(to!string(toMBSz("test6です\n")));
writef(to!string(toMBSz("test7です\n")));
writef(to!string(toMBSz("test%dです\n")), 8);
writef(to!string(toMBSz("test%dです\n")));
getchar();
return 0;
}
虚数はリテラルの末尾にiを付けて表す。
複素数は1つの実数と1つの虚数を組み合わせた値
文字列は文字列の動的配列で表される。
プロパティ
すべての式と型はプロパティを持っている。
全ての型のプロパティ
整数型のプロパティ
浮動小数点のプロパティ
非数NaN
虚数・複素数
typedef
型の別名を定義する。
typedef オリジナルの型名 新しい型名;
typedef オリジナルの型名 新しい型名 = 初期値;
C言語などと違いオリジナルの型とは別の型として扱われる。
定義した型にint型などの値を代入するときはキャストが必要。(逆の場合は、暗黙のキャストが行われる。)
新しいく定義した型にオリジナルとは異なる初期値を設定することができる。
alias
型の別名を定義する。
alias オリジナルの型名 新しい型名;
alias オリジナルのシンボル名 新しいシンボル名;
C言語と同じようにオリジナルの型と同じ型として扱われる。
既知の変数や関数の別名を付けることができる。
キャスト式
cast(型名)式;
const属性
const 型 変数名 = 定数;
const
{
型 変数名 = 評価式;
}
静的配列
動的配列
連想配列
ポインタ
配列へデータセット
a[0] = 1;
a[0..4] = 1;
a[] = 1;
配列aの0番目の要素に1を代入
a[0], a[1], a[2], a[3]にそれぞれ1を代入
配列aのすべての要素に1を代入
配列のスライシング
b = a;
b = a[];
b = a[0..5];
配列aの全要素を取り出す。
配列aの全要素を取り出す。
配列aからa[0]~a[4]までの要素を取り出す。
値をコピーしているのではなく参照先を取り出している。
配列のコピー
b[] = a[0..5]
b[0..5] = a[5..10]
a[0..5] = a[5..10]
配列aのa[0]~a[4]の要素を配列bにコピー。
配列aのa[5]=a[9]の要素を配列bのb[0]=b[4]にコピー。
同じ配列内でのコピー。範囲が重複した場合はエラーになる。
右辺と左辺の範囲のサイズが異なるとエラーになる。
算術演算子
関係演算子
論理演算子
インクリメント演算子、デクリメント演算子
ビット演算子
シフト演算子
代入演算子
その他の演算子
条件演算子
条件 ? 式1 : 式2
条件式を評価し、その結果がtrueなら式1、falseなら式2の結果を返す。
演算子オーバーロード
単項演算子
二項演算子
if文
if( 式 )
{
処理;
else
処理;
}
while文
while( 式 )
{
処理;
}
continue文とbreak文が使用可能
do-while文
do
{
処理;
}
while( 式 )
{
処理;
}
continue文とbreak文が使用可能
for文
for( 初期値; 式; 増分 )
{
処理;
}
初期値で変数宣言ができる。(スコープはfor文内)
continue文とbreak文が使用可能
switch文
shitch( 式 )
{
case ラベル1, ラベル2:
処理;
case ラベル3:
処理;
...
default:
処理
}
foreach文
foreach( 型名 value変数名; 式 )
{
繰り返される処理;
}
foreach( 型名 index変数名, 型名 value変数名; 式 )
{
繰り返される処理;
}
value変数には、繰り返し処理の際に、式で指定した集合の要素が1つずつ格納されていく。
index変数には、集合要素のインデックスが格納される。
式には、静的配列、動的配列、連想配列、構造体、クラスのいずれかが入る。
goto文
goto ラベル; // プログラム中にある指定されたラベルが付けられた文まで処理を移す
// switch文で使用
goto default; // default節に処理を移す
goto case; // 直後のcase文に処理を移す
goto case ラベル; // 指定されたラベルのcase文に処理を移す
continue文
ループ処理を中断し、continueが含まれる最内のループの先頭に戻る。
break文
breakが含まれる最内のループの処理を中断し次の処理に移る。
関数定義
C言語などのプロトタイプ宣言は必要ない
戻り値型 関数名( 引数リスト )
{
文;
}
関数の例
import std.stdio;
int main(char[][] args)
{
showMessege();
return0;
}
int showMessege()
{
write("D language\n");
writeln("D language");
writefln("D language");
return 0;
}
関数オーバーロード
関数の引数
戻り値型 関数名( in 型 変数, out 型 変数, inout 型 変数 )
in:値渡し、なにも指定しなければin扱いになる。
out:ポインタ渡しまたは、参照渡し。呼び出したときに、型の初期値(.init)で初期化される。
inout:ポインタ渡しまたは、参照渡し。呼び出されたときに、渡された値で初期化される。
関数のネスト
関数のポインタ
デリゲート
関数リテラル
可変長引数
クラス定義
コンストラクタ
デストラクタ
静的メンバ
静的コンストラクタ
静的デストラクタ
仮想関数
継承
オーバーロード
override属性
スーパークラスの参照
抽象クラス
インターフェース
アクセス保護属性
クラスのプロパティ
演算子オーバーロード
関数呼び出し演算子のオーバーロード
配列演算子のオーバーロード
クラス不変条件
単体テスト
空白、改行の入れ方
・原則として1行に記述するのは1文とする。
・タブは8桁。それ以外の桁数に設定さてる環境ではタブの使用を避ける。
・インデントは2つ以上の空白によって、レベルごとに揃える。
・演算子とオペランドの間には空白を1つ入れる。
・関数定義と関数定義の間には空行を2つ入れる。
・関数定義の中では、変数宣言と実行文の間に空白を1つ入れる。
コメント
・1行コメントには//を使用する。
・複数行コメントには/* */を使用する。
・ネストコメントには/+ +/を使用する。
環境変数
PATH:C:\dmd2\windows\bin
LIB:C:\dmd2\windows\lib