Origin Cは、 if, if-else, switch, for, while, do-while, goto, break, continue を含むANSI Cのすべてのフロー制御をサポートしています。さらに、Origin CはC#のforeachサポートし、オブジェクトのコレクションをループすることができます。
if ステートメントは、条件分岐に使われ、条件がTrueの場合にステートメントブロックを実行します。 if-else ステートメントは、if ステートメントに似ていますが、if-else ステートメントは、条件の結果がFalseの場合に代替えのステートメントブロックを実行します。
以下は、異なる入力タイプを使った、Origin Cのif ステートメントのサンプルです。
bool bb = true; // ブール型 if( bb ) { out_str("bb is true"); } int nn = 5; if( nn ) // 整数型, 0 = false, 非ゼロ = true { out_str("nn not 0"); } double* pData = NULL; if( NULL == pData ) // ポインタが NULLの場合チェック { out_str("Pointer pData is NULL"); }
次は、Origin Cのシンプルな if-else ブロックです。ifブロックとelseブロックが中括弧{}で囲まれています。
if( bRet ) { out_str("Valid input"); // bRetがtrueのとき } else { out_str("INVALID input"); // bRet がfalseのとき }
ifステートメントが1つのステートメントしか持たない場合、中括弧は任意です。 これは、上記のコードが中括弧無しで書けるということを意味します。
if( bRet ) out_str("Valid input"); // bRetがtrueのとき else out_str("INVALID input"); // bRetがfalseのとき
switch ステートメントは、相互に排他的な選択肢によって、異なるステートメントブロックを実行する必要があるときに使われます。
ケースは、昇順の整数で、switch ステートメントに整数の引数で与えられる数値で開始します。 break コマンドは、どのケースでもswitchブロックを抜けます。
switch( nType ) // 条件として整数型の値 { case 1: case 2: out_str("Case 1 or 2"); break; case 3: out_str("Case 3"); // breakキーワードがないとcase 4を実行 case 4: out_str("Case 4"); break; default: out_str("Other cases"); break; }
for ステートメントは、指定した回数または各要素がインデックスで参照しているデータの配列によって、1つ以上のステートメントを実行するのに使われます。
char str[] = "This is a string"; for( int index = 0; index < strlen(str); index++ ) { printf("char at %2d is %c\n", index, str[index]); }
While と do-whileステートメントは、条件が合致するまでステートメントブロックを実行します。 while ステートメントは、ループの最初に条件を検査し、do-while ステートメントは、ループの最後に条件を検査します。
int count = 0; while( count < 10 ) // 条件がTrueの場合にステートメントを実行 { out_int("count = ", count); count++; }
int count = 0; do { out_int("count = ", count); count++; } while( count < 10 ); // 条件がTrueの場合にステートメントを実行
ジャンプステートメントは、関数の範囲内で、無条件に別のステートメントにジャンプ するのに使います。 break, continue, goto ステートメントがジャンプステートメントです。 次のサンプルはこれらのジャンプステートメントを示します。
for( int index = 0; index < 10; index++ ) { if( pow(index, 2) > 10 ) break; // ループの終了 out_int("index = ", index); }
printf("The odd numbers from 1 to 10 are:"); for( int index = 1; index <= 10; index++ ) { if( mod(index, 2) == 0 ) continue; // 次のインデックス printf("%d\n", index); }
out_str("Begin"); goto Mark1; out_str("Skipped statement"); Mark1: out_str("First statement after Mark1");
foreach ステートメントは、オブジェクトのコレクションをループするのに使われます。 次のコードは、プロジェクト内のすべてのページをループし、その名前とタイプを出力します。
foreach(PageBase pg in Project.Pages) { printf("%s is of type %d\n", pg.GetName(), pg.GetType()); }
Origin Cのクラスに基づくすべてのCollectionのリストについては、コレクションのセクションを参照してください。