Back to page

− Links

 Print 

Backup source of Articles​/D言語入門講座​/第13章 - その他の文法1 (No. 1) :: D言語友の会

Backup source of wiki:Articles/D言語入門講座/第13章 - その他の文法1(No. 1)

  Next »[4]
TITLE:with, switch, foreach, goto文について
#navi

* #01 - with文 [#a8f62514]
** 今回は… [#i32ed229]
以前構造体を使用しましたね。~
今回は、その構造体のメンバを一気にまとめて変更したい場合なんかに有効な文法 ''with'' 文を紹介します。~
この文法はC言語には存在しません。~
このキーワードが存在する言語としては、JavascriptをはじめとするECMAScript系の言語なんかが有名ですね。

** 今回のミソ [#w860d816]
-  使い方は以下の通り
#code(d,nomenu,nonumber,nooutline){{{
with(構造体の変数)
{
	...処理...
}
}}}
- 上の...処理...のところでは、構造体の変数の名前を使用しなくてもその構造体の中身にアクセスできる



** サンプルコード [#z58bf9e0]
#code(d,sample1301p.d);
#region(Tango用はこちら){{
#code(d,sample1301t.d);
}}


** 実行結果 [#ua652471]
#code(console){{{
$ dmd -run sample1301p.d
a = 10
b = 20
c = 30
x = 40
y = 100
z = 180
}}}


** まとめ [#i88edf53]
というわけで、''with''文。使いどころが難しいかもしれませんが、使えるところでは使えますよ。~
具体的には、もっと先でやる''class''のメソッドやプロパティと呼ばれるものにもアクセスできたりするので、オブジェクト指向向きの文法と言えます。~
今のところは構造体をもっと使いやすくする方法という感じで覚えておくといいかもしれませんね。


* #02 - switch文 [#j2b23312]
** 今回は… [#y9eac2b6]
''switch''文を説明します。これは条件分岐の一種の文法です。なので、''if''や''else''を使用しても同じ挙動が期待できる場合が多いです。~
ただ、''switch''文は、C言語にも存在する割とベーシックな文法です。いろいろなところで見るかと思いますので、一応触れておきます。~
if文で十分に代用可能な文法ですが、もしかしたら最適化が計れて速度的に有利になることがあるかもしれません。あまり期待はできないけど。~
特に、Windowsプログラミングにおけるウィンドウプロシージャの内部処理には頻繁に登場する文法です。~
筆者的には''swtich''文の文法が若干気味悪く感じるのでifを使うことのほうが多いですが…

** 今回のミソ [#kf3e2ae8]
- 多条件分岐、switch文を使うには以下のようにする。
#code(d,nomenu,nonumber,nooutline){{{
switch (式)
{
case(値1):
    式が値1だったときの処理;
    break;
case(値2):
    式が値2だったときの処理;
    break;
default:
    デフォルトの処理;
}
}}}
- 分岐には ''case''文と''default''文を使う
- 式 が '''case 値:''' の値になった場合、そこへ飛ぶ。
- 式 が複数ある '''case 値:''' のどの値にも当てはまらなかった場合、 '''default: ''' へ飛ぶ。
- 終わる場合は ''break'' を使う。
- ''break''しない''case''文はその次の''case''文もつづけて実行する。


** サンプルコード [#i3684cad]
#code(d,sample1302p.d);
#region(Tango用はこちら){{
#code(d,sample1302t.d);
}}


** 実行結果 [#u4b1af8a]
#code(console){{{
$ dmd -run sample1302p.d
零の場合
一の場合
二の場合。breakがないので次のも実行。
三の場合
三の場合
デフォルトの挙動
}}}


** まとめ [#d4a627d9]
''switch''文は使いどころが限られます。正直ifのほうが使いやすかったりもします。
ただ、何度も
#code(d,nomenu,nonumber,nooutline){{{
if (x == 1)
{
	...
}
else if (x == 2)
{
	...
}
else if (x == 3)
{
	...
}
else
{
	...
}
}}}
といったように x == ... のような似たような条件を繰り返して使いたくない場合に使うといいと思います。
………ほかにswtichの有用性について知っている方がいたら教えてください

* #03 - foreach文 [#u7fe7d6f]
** 今回は… [#l74dfcd9]
''foreach''文です。''foreach''文は繰り返し構文の一種です。~
''foreach''文はC言語では使用できません。利用できる言語は[[Wikipedia:Foreach文]]を見るといいでしょう~
''foreach''文は配列などに関して、すべての要素に対して処理を行う場合に非常に便利な文です。~
配列など、というのは他にも使えるものがあって、ある特定の条件を満たした構造体、クラス、連想配列にも使うことができるます。これらはのちの講座で解説します。

** 今回のミソ [#y51e3cb3]
- '''foreach'''文を使うには次のようにします
#code(d,nomenu,nonumber,nooutline){{{
foreach (val; list)
{
	...
}
}}}
- '''val'''は'''list'''の中のデータが一つずつ入る
- ''foreach''文を使うと、''break''するかすべての要素をめぐるまでループする
- valは型名などを使ってもよいが、使わなくても勝手に推測してくれる
- リストの要素の変更をする場合は次のよう ''ref'' を使います。
#code(d,nomenu,nonumber,nooutline){{{
foreach (ref val; list)
{
	...
}
}}}


** サンプルコード [#c80fddb7]
#code(d,sample1303p.d);
#region(Tango用はこちら){{
#code(d,sample1303t.d);
}}


** 実行結果 [#f8ae6e5b]
#code(console){{{
$ dmd -run sample1303p.d
4
3
2
5
7
val[0] = 16
val[1] = 25
val[2] = 35
val[3] = 46
val[4] = 58
}}}


** まとめ [#i008569d]
さてforeachもswitch同様forやwhile文で同じものが記述できます。~
では、いったい何がいいのか。~
まず、その一つとして、このような配列をすべて廻るようなものでは添え字が配列に対して大きすぎる値を入力することが少なくなります。バグの原因を減らせます。~
ほかにも、簡単な記述が可能ということや、限定された使い方であるため最大の効率化が期待できたりもします。((これもやはりあまり期待できませんが。))~
D言語では、人によってはfor文以上に使うことが多くなるかもしれませんね。

* #04 - goto文 [#ke4a660a]
** 今回は… [#o15287c1]
''goto''文についてお話します。~
この構文はまずほとんど使うことはないと思います。~
なので軽めに。

''goto''文は古くはアセンブリの時代から非常に愛されてきた文です。~
''for''や''while''などの繰り返し文にも代用として使えますし、''switch''文の代用にもすることができる、非常に強力な文です(笑)。

ちなみに、なんでほとんど使わないかというと、プログラムが煩雑になりやすいからです。~
あちこちにジャンプして、流れがつかみにくいプログラム、それを、スパゲッティプログラムと言います。~
そんなコードを書かないように注意しましょう。

** 今回のミソ [#s7f833e3]
- '''LABEL:''' としてラベルを定義
- ラベルの定義は";"(セミコロン)じゃなく":"(コロン)なので注意。
- ''goto'' '''LABEL'''; としてラベルにジャンプする
- ''goto''を使うとプログラムコードが煩雑になりやすいため、使いどころを考えなければならない



** サンプルコード [#mcd9a37e]
#code(d,sample1304p.d);
#region(Tango用はこちら){{
#code(d,sample1304t.d);
}}


** 実行結果 [#s7068dd0]
#code(console){{{
$ dmd -run sample1304p.d
L_LABEL5
L_LABEL4
L_LABEL2
L_LABEL1
L_LABEL3
L_END
}}}


** まとめ [#wea83f84]
サンプルコードでは''goto''単体として使っていましたが、ふつうは''if''文などと組み合わせて使用します。~
もし値が1ならLABEL1にジャンプする…と。このように使うのですが、これは''switch''でできますし、関数なんかにまとめたほうがよっぽど読みやすいコードになります。~
できる限り''goto''文をなくすようにしましょう。



* #summary - まとめ [#d931e161]
** 第13章のミソ [#w8470283]
- with文について
-- ''with''文の使い方は以下の通り
#code(d,nomenu,nonumber,nooutline){{{
with(構造体の変数)
{
	...処理...
}
}}}
-- 上の...処理...のところでは、構造体の変数の名前を使用しなくてもその構造体の中身にアクセスできる
- switch分について
-- 多条件分岐、switch文を使うには以下のようにする。
#code(d,nomenu,nonumber,nooutline){{{
switch (式)
{
case(値1):
    式が値1だったときの処理;
    break;
case(値2):
    式が値2だったときの処理;
    break;
default:
    デフォルトの処理;
}
}}}
-- 分岐には ''case''文と''default''文を使う
-- 式 が '''case 値:''' の値になった場合、そこへ飛ぶ。
-- 式 が複数ある '''case 値:''' のどの値にも当てはまらなかった場合、 '''default: ''' へ飛ぶ。
-- 終わる場合は ''break'' を使う。
-- ''break''しない''case''文はその次の''case''文もつづけて実行する。
- foreach文について
-- '''foreach'''文を使うには次のようにします
#code(d,nomenu,nonumber,nooutline){{{
foreach (val; list)
{
	...
}
}}}
-- '''val'''は'''list'''の中のデータが一つずつ入る
-- ''foreach''文を使うと、''break''するかすべての要素をめぐるまでループする
-- valは型名などを使ってもよいが、使わなくても勝手に推測してくれる
-- リストの要素の変更をする場合は次のよう ''ref'' を使います。
#code(d,nomenu,nonumber,nooutline){{{
foreach (ref val; list)
{
	...
}
}}}
- goto文について
-- '''LABEL:''' としてラベルを定義
-- ラベルの定義は";"(セミコロン)じゃなく":"(コロン)なので注意。
-- ''goto'' '''LABEL'''; としてラベルにジャンプする
-- ''goto''を使うとプログラムコードが煩雑になりやすいため、使いどころを考えなければならない


** 宿題 [#pa1f523f]
この章で紹介したサンプルコードをすべてwith,switch,foreach,for,while文を使わずに期待される動作を全く同じになるように記述してみてください。


** コメント [#o0782947]
今回の宿題はつまり、繰返しや分岐を使わないで、どのようにプログラムが流れているかを確認するためのものです。~
goto文を使って再現してみるのもいいかもしれません。あまり役には立たないと思うけど。 そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~


#navi


* 投票とコメント [#o93ce05e]
#vote(#lastvote:f7be5ced040c1d07aa16e6e0c1e58bb3,大変参考になった[1],参考になった[1],あまり参考にならなかった,まったく参考にならなかった)
#pcomment

  Next »[4]