(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.色々な便利な方法
|