◆◆◆◆アマゾンで購入する◆◆◆

9.C言語特有の代入文・制御構造 
           内    容
(1)ちょっと便利な代入文
(2)while以外の繰返し
(3)else ifが連続したら
(4)switch文
(5)条件式
(6)演習


(1)ちょっと便利な代入文

システム記述用言語というからには,
その言語で書かれたプログラムの高速性が要求されます。

このため,C言語では他の言語とは変わった
風変わりな表記法があります。

たとえば,C言語では,

  A=B=C=10;

のように記述することができます。

この代入文では,右から評価され,

 ●まず変数Cに10が入り,
 ●その結果(10)がBに入り,
 ●さらにその結果(10)がAに入る。

と処理されます。

代入文の結果は,代入された値そのものですから,

  C=10; B=10; A=10;

と同等になります。

なぜ,こんな代入文が用意されているかというと,
効率のよいオブジェクトを生成できるようにするためです。

仮想的なアセンブラで示すと,最適化処理がなくても
次のように効率のオブジェクトが生成することができます。



なお,このアセンブラコードを理解する必要はありません。
翻訳結果のコードが少なくなることだけを理解してください。

この他,以下のような便利な代入文もあります

No. 記述 意味
1 A++; A = A + 1;
2 B = A++; B =A; A = A + 1;
3 ++A; A = A + 1;
4 B = ++A; A = A + 1; B = A;
5 A--; A = A - 1;
6 B = A--; B =A; A = A + 1;
7 --A; A = A - 1;
8 B = --A; B =A; A = A + 1;
9 A <OP>= B; A = A <OP> B;
(例) A += B; A = A + B;
A -= B; A = A - B;
A *= B; A = A * B;
A /= B; A = A / B;
A %= B; A = A % B;


このような代入文を使って,
配列を使ったプログラム例を変更してみましょう。

[C 特有の代入文を使って書き直す]
#include "stdafx.h"
int main(int argc, char* argv[])
{
 int A[10],i,total; i=0;
 /* 最初にデータを読み込んでおく */
 while(i<10)
 {
   printf("i=%d :",i);scanf("%d", &A[i]);
   i++;
 }
 total=0; i=0;
 /* 配列のデータを加算 */
 while(i<10)
 {
  total += A[i];
  printf("A = %d ( %d ) \n",A[i], total); i++;
  }
}

(2)while以外の繰返し

while以外に以下のような繰返しがあります。

■後判定型繰返し(do …while)

   文1;
   while(式)文1;

は,次のように書くことができます。

   do 文1;
   while(式)

■forループ

   初期化式;
   while(判定式)
   {
     文1;
     増分式;
   }

は,次のように書くことができます。

   for(初期化式; 判定式; 増分式)文1;

ただし,初期化式,増分式の部分に
複数の式を書く場合は,コンマで区切ります。

文1の部分に複数の文を書くには,
while文のブロックと同じように,
中括弧で囲みます。

[例]
  for(i=1; i<=10; i++) 文;
  for(i=1, j=10; i<=10; i++,j--)文; 

それでは,配列を使ったプログラムを更に改良してみましょう。

[for文を使って改良]
#include "stdafx.h"
int main(int argc, char* argv[])
{
  int A[10],i,total;
  /* 最初にデータを読み込んでおく */
  for(i=0;i<10;i++)
  {
   printf("i=%d :",i);
   scanf("%d", &A[i]);
  }
  /* 配列のデータを加算 */
  for(i=0,total=A[0];i<10;i++,total += a[i])
  printf("A = %d ( %d ) \n",A[i], total);

}


(3)else ifが連続したら

あるデータの値によって何かを処理するような場合
次のようなパターンになることが多くあります。

   if(式1)文1;
   else if(式2)文2;
    else if(式3)文3;
     else if(式4)文4;
      else 文5;

この段落付けは,確かに基本を守っているようですが,
次のように書くと,場合分けであることがはっきりします。

   if   (式1)文1;
   else if(式2)文2;
   else if(式3)文3;
   else if(式4)文4;
   else      文5;

すなわち,else if が続くような場合,
上記のように段落付けするほうが
分かりやすいプログラムになります。

(4)Switch文

判定するための変数が同じで,
しかもその変数が整数型のとき,
次のようなif文で表現することができます。

  [if文の表現]
int ch;
 ・
 ・
 ・
if   (ch == 1){文11; 文12;}
else if (ch == 2){文21; 文22;}
else if (ch == 3){文31; 文32;}
else if (ch == 4){文41; 文42;}
else if (ch == 5){文51; 文52;}
else       {文61; 文62;}

このようなとき,
C言語では次のように記述します。

  [switch文の表現]
int ch;
 ・
 ・
 ・
switch(ch)
{
 case 1 : 文11; 文12; break;
 case 2 : 文21; 文22; break;
 case 3 : 文31; 文32; break;
 case 4 : 文41; 文42; break;
 case 5 : 文51; 文52; break;
 default: 文61; 文62; break;
}

他の言語におけるCase文
(Visual BasicではSelect Case文)に似ていますが,
制御用変数が整数型でなければなりませんので,
Fortranの計算型GOTO文と同一のレベルだと
考えてもいいでしょう。

  [例]
#include "stdafx.h"
#include "string.h"
static char qsttab[4][80]
 ={"おはよう","こんにちは","こんばんは",""};
static char anstab[4][80]
 ={"いい朝ですねー","どちらまで",
  "おやすみなさーい","そんな挨拶知らないよ"};
int main(int argc, char* argv[])
{
 int i;
 while(strlen(gets(qsttab[3]))>0)
 {
  i=0;
  while(strcmp(qsttab[i],qsttab[3])!=0) i=i+1;
  switch(i)
  {
   case 0 : printf(“[朝出勤]”); break;
   case 1 : printf(“[出先で]”); break;
   case 2 : printf(“[帰宅後]”); break;
   default: printf(“[あれっ?]”); break;
  }
  printf("%s\n",anstab[i]);
 }
}


(5)条件式

判定して,どちらかの値をとるようなとき,
例えば

   if (条件式)Z = 式1; else Z=式2;

の形のとき,次のように記述することができます。

   Z = (条件式) ? 式1 : 式2;

なお,式1と式2を区切る文字は
コロン(:)であることに注意しましょう。

2つの変数を入力して,
大きな方の値を表示するプログラムを,
条件式を使って書き直してみましょう。

  [条件式の例]
#include "stdafx.h"
int main(int argc, char* argv[])
{
int a, b;
printf("\n* a=");
while(scanf("%d",&a))
{
  printf("* b="); scanf("%d", &b);
  printf("\n maximum a, b = %d \n",
      
(a > b) ? a : b);
  printf("\n* a=");
 }
}


(6)演習

次のプログラムを,
効率のよいプログラムに書き直してください。

  [条件式の例]
#include "stdafx.h"
static int dt[5]={5,3,4,8,2};
int main(int argc, char* argv[])
{
 int i,j,d; char ch; i=0;
 while (i<4)
 {
  j=i+1;
  while(j<5)
  {
   if(i !=j)
   {
    if(dt[i] > dt[j])
    {
      d=dt[i];dt[i]=dt[j];dt[j]=d;
    }
   }
   j=j+1;
  }
  i=i+1;
 }
 printf("\n Result = ");
 ch='{';
 i=0;
 while(i<5)
 {
  printf("%c",ch);
  printf(" %d",dt[i]);
  ch=',';
  i=i+1;
 }
 printf("}\n");
 getchar();
}
 1.C言語の誕生

 2.C言語の仲間たち

 3.新しい言語をすばやく覚えるには

 4.Cでプログラミング

 5.データの入れ物 変数の考え方

 6.注釈・定数

 7.プログラムの実行順序

 8.配列

 9.C言語特有の代入文・制御構造

10.関数の話

11.構造体と共用体

12.ビット演算

13.プログラムの場所をポインタで

14.ファイルの入出力

15.色々な便利な方法