今後、C言語を用いての数値計算を学習する上で、C言語の重要な事項をまとめる。
- C言語では、大文字と小文字は、区別される。変数名 hogehogeと
Hogehoge、hoGehogeは異なる。
- コメント文は、プログラムの内容をわかりやすくするために記述する
ものである。これは、人間のためのもので、コンパイラーは無視する。
/*〜*/で囲まれた部分が、コメント文となる。行をま
たいでも、それは有効である。
- 識別子とは、変数、記号定数、関数などにつける名前のことである。名
前に用いることができる文字は決まっている。英大文字「A〜Z」と英
子文字「a〜z」、数字の「0〜9」とアンダースコアー「_」である。
- Cはフリーフォーマットで記述でききるので、文の区切りの記号が必要
である。その区切りの記号にセミコロン「;」を用いる。
- コンピューター内部では、\(バックスラッシュ)
と¥(円マーク)の取り扱いは全く同じです。
- {と}は対応しており、{と}で囲まれた部分は、一つの処理のまと
まり(ブロック)を表す。
- プログラムはmain()関数から実行される。
- 基本的には、プログラムは上から下へと処理の動作が行われる。
- 変数は、値を入れておく箱のようなものである。1つの変数に1個の値
を入れておく(記憶)ことができる。
- 変数を使う場合、実行文に先立って、その宣言を行う必要がある。
- 変数は定義してから用いなくてはならない。型と変数名を指定することにより、
変数の定義ができる。これは、プログラムを実行するときに必要な領域を確保す
るために必要で、コンパイラーが実行ファイルを作るときに使う。
- 使用頻度が高い型は、以下の通りである。
型名 |
型指定子 |
変数宣言例 |
文字型 |
char |
char a, b; |
整数型 |
int |
int i,j; |
倍精度実数型 |
double |
double x, y; |
- C言語では、変数の適用範囲は厳密に決められている。ローカル変数とグローバル
変数があり、適用範囲が異なる。
|
ローカル変数 |
関数の中で定義され、その関数の中だけで使用できる。関数が
コールされるとメモリー上に変数が配置される。その関数の処理が終わると
その変数は消滅する。通常、使うのはこれである。 |
|
グローバル変数 |
関数の外で定義され、どの関数でも使用できる。プログラムが
起動されるとメモリー上に変数が配置される。プログラムが終了するまで、
変数は維持される。 |
- C言語で使われる演算子で分かりにくいものを表1
にまとめておく。
表 1:
分かりにくい演算子
種類 |
演算子 |
機能 |
使用例 |
備考 |
算術演算子 |
% |
剰余(余り) |
c=a%b |
除算の余りを計算 |
関係演算子 |
== |
等しい |
if(a==b) |
a==bの演算結果は、0 or 1 |
|
!= |
等しくない |
if(a!=b) |
a!=bの演算結果は、0 or 1 |
論理演算子 |
! |
否定 |
if(!a) |
!aの演算結果は、0 or 1 |
|
|| |
論理和(or) |
if(a || b) |
a || bの演算結果は、0 or 1 |
|
&& |
論理積(and) |
if(a && b) |
a && bの演算結果は、0 or 1 |
代入演算子 |
= |
代入 |
b=a |
右辺の式の値を左辺の変数に代入 |
|
a+=b |
|
b=a |
a=a+bと同じ |
|
a-=b |
|
b=a |
a=a-bと同じ |
|
a*=b |
|
b=a |
a=a*bと同じ |
|
a/=b |
|
b=a |
a=a/bと同じ |
その他 |
++ |
インクリメント |
a++ |
a=a+1と同じ |
|
- |
デクリメント |
a- |
a=a-1と同じ |
- 論理演算では、0が偽(誤り)で 1が真(正しい)となる。
- 0と1以外で論理演算を行った場合、0のみが偽として取り扱われ、非0は真となる。
- キーボードから、値(文字や数値)を読み込むために、
scanf()関数を使う3。読
み込んだ値は、変数に格納される。
- scanf()関数の記述の仕方は、次の通りである。
- scanf("変換仕様の並び ", &変数名, &変数名,
, &変数名);
- 変換仕様とは、キーボードから入力されたものがどのような値か判断
するために使う。主なものは以下の通りである。
1文字 |
%c |
整数 |
%d |
小数 |
%lf |
指数形式 |
%e |
- 変数名は、先頭に&をつける必要がある4。
- ダブルクォーテーションで囲まれた部分 ("出力の並び") に、ディスプレ
イに表示したい文字列や変数の変換仕様を記述する。変換仕様は対応す
る変数の出力方法を決めるものである。
- printf("出力の並び", &変数名, &変数名,
, &変数名);
- 使用頻度の高い変換仕様は、以下の通りである。
1文字 |
%c |
整数 |
%d |
小数 |
%f |
指数形式 |
%e |
- 整数の表示桁数を調整するときは、変換仕様%dの
%とdの間に、表示したい桁数を記述する。
- 少数部の桁を調整するときは、変換仕様%fの%と
fの間に、「.桁数」と記述する。
- 改行したい場合は、改行したい場所に「\n」を記述
する。
- データの区切りにタブ(Tab)が使われることが多い。タブを入れたいときには、
「\t」を記述する。タブとは適当な空白のこと。
- 通常、プログラムは上から下へと実行される。しかし、条件に従い実行の流れを
変えたい場合がある。そのような場合、制御文をつかう。制御文には、分岐と繰り
返しがある。
- 分岐には if 文と switch 文がある。ただし、switch 文は滅多に
使われない。
- if(条件1){文1}else if(条件2){文2}else{文3}
- 条件1が真の時、文1が実行されます。条件1が偽の場合、次の条
件2の真偽を判断し、真ならば文2を実行します。else
if文はいくらでも書くことができます。
- 最初に真である条件に続く文を実行すると、if文から
抜けます。
- 全てのif又はelse ifの条件が偽ならば、
elseの文3を実行します。
- switch(式)
- 使用頻度の高い繰り返し文は、次の3個である。
- for(初期値;継続条件式;再設定式){文}
- 実行順序は、以下の通り。
- (1)
- 初期値の設定
- (2)
- 継続条件が真ならば、続く文を実行し、偽ならば
for文は終了する。
- (3)
- 再設定式を実行
- (4)
- 再び、(2)から実行する。
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 0;
6 b = 0;
7
8 for(a=1; a<=100; a++){
9 b += a;
10 }
11
12 printf("b = %d\n",b);
13
14 return 0;
15 }
- do{文}while(継続条件式);
- 実行順序は、以下の通り。
- (1)
- 文を実行
- (2)
- 継続条件式が真ならば(1)へ戻り、偽ならば
do文は終了
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 1;
6 b = 0;
7
8 do{
9 b += a;
10 a++;
11 }while(a<=100);
12
13 printf("b = %d\n",b);
14
15 return 0;
16 }
- while(継続条件式){文};
- 実行順序は、以下の通り。
- (1)
- 継続条件式が偽ならば、while文は終了。新な
らば、(2)へ
- (2)
- 文を実行
- (3)
- (1)へ戻る
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 1;
6 b = 0;
7
8 while(a<=100){
9 b += a;
10 a++;
11 }
12
13 printf("b = %d\n",b);
14
15 return 0;
16 }
- 配列は、同じようなデータが多くある場合に使います。多くのデータ
に一つずつ名前をつけると大変です。1万個のデータがあった場合、1万
個の名前を付けた変数を用意しますか?。下の例で、変数を用いての大
量のデータ処理が不可能ということが分かるでしょう。
- 1万個の変数で領域を用意する場合の宣言
|
double aaa, aab, aac, aad, aae, aaf; |
|
|
|
double oun, ouo, oup, ouq; |
- 配列で1万個の領域を用意する場合の宣言
- 配列を使う場合も宣言が必要です。宣言の例は、以下の通りです。
配列の次元 |
要素数 |
宣言例 |
1次元 |
100 |
double x[100] |
2次元 |
100100 |
double x[100][100] |
3次元 |
100100100 |
double x[100][100][100] |
- 配列添字は0から始まります。したがって、「double x[1000]」
と宣言した場合、使える配列は、x[0]〜x[999]まで
です。
- 添字である数字でデータの指定ができるため、メモリからのデータの読
み書きが単純化できます。
この辺はテストにでないが、以下について理解して欲しい。
- 通常の変数には整数や実数の値を格納するが、ポインターにはアドレスを格納す
る。
- ポインターの宣言には、型名とアスタリスク(*)を付ける。
int *pi;
double *px;
- 変数のアドレスを取り出すには、変数名の前にアンパサンド(&)をつける。
&はアドレス演算子である。
pi=&i;
px=&x;
- ポインターが示しているデータの値を取り出すためには、ポインター変数の前に
アスタリスク(*)をつける。*は間接参照演算子である。
j=*pi;
y=*px;
- コンパイルに先立って、ソースプログラムを整形する機能をプリプロセッサーと
言う。プリプロセッサーは、必ず#から始まる。
- #include文は、引き続くファイルがそこに展開される。
- #define文は、文字の置き換えに使われる。
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年6月24日