ぜんかいまでの記録
大体わかってきたから標準ライブラリに早くいきたい.
breakやcontinueとかいろいろのこってるらしいけれど飛ばして読みかけてしまった
§4 制御構文(続
4.3 ループの制御
修了条件にかかわらずループを抜け出したい, 特定の周回だけをパスしたいときに使う構文
4.3.1 break命令
ループを強制的に中断させる. break;
4.3.2 continue命令
現在の周回だけスキップして次のループに行く continue:
どちらもifと一緒に使うのが一般的
int i;
int sum = 0;
for(i=1; i<=100; i++)
{
sum += i;
if(sum > 1000)
{
break;
}
}
Console.WriteLine(i);
int sum2 = 0;
for(int i=0; i<=100; i++)
{
if(i%2 != 0)
{
continue;
}
sum2+=i;
}
Console.WriteLine(i);
4.3.3 ループのネストとbreak/continue
ネストした構文でbreakを使った場合内側のloopのみを抜けるよ.
for (var i=1; i<10; i++)
{
for(var j=1; j<10; j++)
{
var result = i * j;
if(result>40)
{
break;
}
Console.Write($"{result, 2}"); // resultを最低二桁で表示
}
}
4.4 制御命令のその他の話題
gotoとプリプロセッサ
4.4.1 goto
あぁ...スパゲティのおとぉ...
ラベルとgotoを使うことで強制的にコードのhそりを他の場所に移動ができます
//template
labelName:
goto labelName:
//ex.
goto THERE;
Console.WriteLine("Skipped Line");
THERE:
Console.WriteLine("DONE");
以下注意点
- どこへでも移動できるわけではない. 他メソッドとかループ外から内部へ移動は不可
- 可読性低い. 使うか使わないかは宗教論争
使うときは
- ネストされた中のループから一気に外のループ含めて脱出するとき
- switchで他ラベルに飛ぶとき
等が一応は考えられる.
要するに一つの構文の中で完結しようなってことだと思う
4.4.2 プリプロセッサ
コンパイラーに対する命令, ディレクティブを表すもの
ファイルの文頭に宣言をする
シンボルのスコープ(?)はファイル単位
例を以下に
ディレクティブ | 概要 |
---|---|
#define A | シンボルAを定義 |
#undef A | シンボルAを未定義に |
#if A...#else...#endif | シンボルAがある時, ifのコード, ない場合はelseのコードをコンパイル |
#if A...#elif B...#elif C...#endif | ifのelse ifバージョン. コンパイラするコードのより複雑な制御 |
#region...#endregion | コードブロックを指定 |
#warning [message] | 警告メッセージを表示 |
#error [message] | エラーメッセージを表示 |
#line n "file" | エラー/ 警告時の行番号(n)/ファイル名(file)を固定 |
#pragma warning [disable/restore] list | listで示された警告を有効(restore)か無効(disbale)にする |
条件コンパイル
#defineと#ifを利用することでデバッグ時だけ有効なコードを定義できる
#define DEBUG
#if DEBUG
Console.WriteLine("asdf");
#endif
シンボルは特定の値を持つことはできない.
ifディレクティブの条件式
ifのなかでは, 論理演算子が利用可能
#if (DEBGUG && TESTED)
といった記述が可能
折り畳み可能なブロック
#region [hogehoge
]を使うことでhogehogeというメモを残したままVS上でコードを折りたためる(メソッドができるように)
ようやく標準ライブラリだ...Chapterもついに5まで来た. 頑張ろう