動かして確かめよう
では、シミュレータSM+でif文の動作を試して見ましょう。
まずはソースファイルを作成します。記事「シフト演算」と同様、PM plusの[ファイル]→[新規作成]でリスト1のプログラムを入力し、iftest.cというファイル名で保存してください。
void main()
{
volatile char Var;
Var = 5;
if ( Var < 10 ) {
Var = Var + 1;
}
else if ( Var < 20 ){
Var = Var + 2;
}
else {
Var = 0;
}
}
次に、記事「シフト演算」を参考に、新しいプロジェクト「分岐」を作成してください。プロジェクト・ファイル名は「分岐」、ソース・ファイルの設定ではiftest.cを追加します。ここまでの様子を図1に示します。

変数宣言にvolatile という見慣れない単語が登場しました。これはシミュレータでの実験をやりやすくするためのおまじないです。5つのルール外の文法ですが、詳しく知りたい方は、下の解説を読んでください。もちろん、読み飛ばしてもまったく問題はありません。
volatileはボラタイルと読みます。Cコンパイラはソース・プログラムを機械語に翻訳するとき、最適化という処理を行います。たとえば、今回の例の場合、
Var = 5;
if ( Var < 10 ) {
の部分がどのような機械語命令になるか考えてみましょう。
今回使用しているマイコン78K0S/KA1+では、代入や比較などの演算は必ずアキュムレータという演算回路で行います。変数はメモリ上に確保されますが、そこに直接値を入れたり、メモリの内容と値を比較したりはできないのです。すべてアキュムレータを介して実行します。
そのため、上記のソースプログラムは機械語では以下のような処理になります。
Var = 5 ;
- アキュムレータに5を入れる
- 変数Varにアキュムレータの値を入れる
if ( Var < 10 )
- アキュムレータに変数Varの値を読み込む
- アキュムレータと10を比較する
ここで、3.の処理に注目してください。2.が終わった時点で、アキュムレータと変数Varの値は同じはずです。なので、わざわざ変数Varから値を読み込む必要はありません。Cコンパイラはこのことを判断して、3.は不要な処理として機械語を生成しません。これが最適化と呼ばれる処理です。
しかしプログラムの目的によっては、この最適化が困るときがあります。コンパイラ全体ではコンパイラの設定(最適化オプション)で設定しますが、個別に特定の変数に関してだけ最適化をしないでほしいときに、変数宣言時にvolatileという修飾語をつけてコンパイラに知らせるきまりになっています。
今回、シミュレータで変数の値をいろいろ変えて実験します。Var = 5 ;が実行された直後にVarの値を変更しますが、その際3.の処理がないとせっかくVarの値を書き換えてもif文はVarの値でなくアキュムレータの値で判断処理をしてしまうので、意図した実験結果となりません(興味があれば、if文の実験後、volatileをつけないで同じことを試してみてください)。
いつものように[ビルド]→[ディバグ]を行って、シミュレータSM+を呼び出します。新しいプロジェクトですので、SM+起動時には設定(Configuration)をたずねるダイアログが表示されます。記事「シフト演算」を参考に周波数設定だけするか、あるいはそのままOKしてしまってもかまいません。SM+の起動直後の様子を図2に示します。

まずはこのまま動かしてみましょう。いつものようにステップアイコン
かF8キーで1行ずつ実行します。5行目で変数Varには5を代入します。7行目はif文で、条件が「Varが10未満だったら」ですから、この条件は成立して8行目に制御が移り、最後にif文から抜けます。この動作の様子を図3に示します。

