D言語入門記事 ~定数の表現(2)と変数~

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

D言語入門記事 ~定数の表現(2)と変数~

投稿記事 by tk-xleader » 13年前

前回の記事の続きから始めます。

[1] 論理値リテラルと文字リテラル

1.論理値リテラル

 bool型は、真か偽かを表す型ですが、これに対応して、true と false という定数が存在し、それぞれ真と偽に対応します。
 一方で、bool型は整数型と相互に変換しあうことが出来て、「bool型 → 整数型」の場合、真の場合は1、偽の場合は0に変換されます。逆に、「整数型 → bool型」の場合、0の場合は偽に変換され、それ以外の場合は真に変換されます。

2.文字リテラル

 文字リテラルは、半角一文字を'(一重引用符)で括ります。エスケープシーケンスもまた、半角一文字として考えます。
 数値としては、その文字のUnicodeにおける文字コードになります。

CODE:

import std.stdio;

void main(){
	writefln("%c",'u');
	writefln("%c",'\n');
}
出力結果
u

► スポイラーを表示
[2] 変数

 C言語と同じで、D言語で一時的なデータの保存、読み出しを行うには、変数というものを使います。そして、宣言や定義の方法はC言語とほとんど同じです。単純に言えば、

型名 変数名;

というように宣言します。当然、変数名は識別子の命名ルールに従います。C言語と見た目は同じですが、変数は型ごとに決められた初期値に基づいて初期化されます。

CODE:

整数型 → 0
実数型 → NAN (要するに、エラーであることを表す値)
論理型 → false
char型 → 0xFF
 当然、C言語と同様に、宣言と同時に初期化することも出来ます。

CODE:

import std.stdio;

void main(){
	int value = 100;
	writefln("%d",value);
}
 全く同じ型であれば、やはりC言語と同様に複数の変数を一気に宣言することが出来ます。具体的には、,(コンマ)で区切ります。

CODE:

import std.stdio;

void main(){
	int value1 = 100,value2 = 200;
	writefln("value1 = %d,value2 = %d",value1,value2);
}
► スポイラーを表示
また、使い方も同じようなものです。前の2つのサンプルコードのように、値が欲しいところで変数名を書くだけなのですから…

[2] 記憶クラスと変数の生存範囲、型推論

 変数の性質を決定付けるものの一つに、「記憶クラス」というものがあります。記憶クラスとは、変数の生存範囲や、定値性を指定する為のものです。D言語では、主に次のような種類があります。

・auto
・const
・immutable
・scope
・static
・synchronized
・__gshared

 これらを変数に付けたい場合、型名の前に記述します。複数の変数を同時に宣言した場合は、その全てに記憶クラスが付加されます。

CODE:

auto int val; //これは、auto記憶クラスのint型変数valの宣言
 ここでは、変数の生存範囲に関わる、「auto,static,__gshared」について説明しようと思います。

1.auto

 これは、自動変数のを表す記憶クラスです。自動変数とは、スコープが存在する変数です。簡単に言えば、関数の内部、ブロックの内部だけで有効な変数です。普通は、記憶クラスを省略して宣言します(C言語でも、autoを付けて変数宣言をするような助長なことはしませんが、それと同じです)。

CODE:

void main(){
	int val1;
	{
		int val2;
	/*val2の生存範囲の終了地点*/
	}
/*val1の生存範囲の終了地点*/
}
 これらの規則は、C言語と全く同じ規則です。

2.static

 これは、静的変数を表す記憶クラスです。静的変数は、プログラムの終わりまで生存する内部変数です。
 静的変数についても、C言語と全く同じ規則です。

3.__gshared

 D言語にもグローバル変数が存在します。ところが、記憶クラスを付けずに宣言されたグローバル変数は、スレッドごとに変数が生成されてしまいます(いわゆるTLS)。そこで、すべてのスレッドで共有したいグローバル変数を使うときには、__gshared記憶クラスを付加します。

*型推論

 変数の宣言時に初期値が与えられるとき、変数の型はなくても、コンパイラにはその変数を初期値の型にすればいいということが分かるはずですよね。そこで、D言語では一定の条件を満たしたときに、変数の型を省略することが出来ます。これが型推論です。まず、記憶クラスが吹かされていて、変数に初期値が与えられている場合が、それに相当します。

CODE:

import std.stdio;
 
void main(){
        auto val1 = 0,val2 = -9.2; //変数の型が省略されている!!
        writefln("%d,%f",val1,val2);
}
実行結果
0,-9.200000

これ以外にもありますが、それはまた後日解説します。

前の記事「識別子の名前、データ型と定数の表現(1)」 ←→ 次の記事「比較演算とプログラムの制御文(1)
最後に編集したユーザー tk-xleader on 2012年3月22日(木) 23:39 [ 編集 3 回目 ]

beatle
記事: 1281
登録日時: 13年前

Re: D言語入門記事 ~定数の表現(2)と変数~

投稿記事 by beatle » 13年前

整数型とchar型の暗黙の初期値が異なるのが気持ち悪いw

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

Re: D言語入門記事 ~定数の表現(2)と変数~

投稿記事 by tk-xleader » 13年前

>beatleさん

書き忘れていましたが、wchar型(16bit)の初期値は0xFFFFで、dchar型(32bit)の初期値は、0x0000FFFFだったりします。この辺りはちゃんと確認しておかなければならないところですね。