第一回(表示、演算、変数)


C言語とは

C言語は、UNIX(OSの種類の名前です。)の開発者がUNIXのために開発したプログラミング言語です。言語規格では プログラミング言語Cという名称ですが、C言語という名前が主流です。C言語は世界でも非常にプログラマ人口が高く、一番最初に学ぶプログラミング言語にする人も、非常に多いです。やろうと思えば、ゲームを作ったり、ソフトウェアや、OSを作ることもできます。

開発環境

C言語はコンパイラというプログラムのソース(プログラムの元となるテキストデータ)を機械語(コンピュータが認識できる言葉)に変換するものが必要です。コンパイラにはいくつか種類がありますが、Windows環境で動作させることを考えて、Borland C++Compiler(略してBCC)を使うことにします。<http://www.codegear.com/jp/downloads/free/cppbuilder>

また、C言語用のエディタとして、CPad for Borland C++Compiler(略してBCPad)を使うことにします。<http://hp.vector.co.jp/authors/VA017148/>

これは送金義務のないシェアウェアなので、無料で使用できます。詳細はこちらで→BCPadシェアウェアについての考え

ちなみにこの環境はラボには既にあります。家でやってみたいという人はぜひ、入れてみてください。(入れ方がわからない場合は僕、または他の先輩にきいてみてください。ノートPCなら、誰かいるときにラボに持ってきてもらえれば、入れることも可能です。)

C言語の基本

まずは基本的なプログラムを見てみましょう。このプログラムを実行(BCPadでF9を押す。)すると、Hello, world!と表示されます。(保存するときの拡張子は.cです。)

#include<stdio.h>

int main(void);

int main(void){
	
	printf("Hello, World!\n");
	
	return(0);
}

では、1行1行見ていきましょう。

1行目
#include<stdio.h>です。stdio.hは、ヘッダファイルの1つで#include<>の中に書くことで、偉い人が作ってくれた関数(詳しくは第4回でやります。)を使うことができるようになっています。今はおまじないと思ってもらえればいいです。
3行目
int main(void);です。これはプロトタイプ宣言と言って、プログラム内の関数の並びをコンパイラに伝えるための役割があります。詳しくは、第4回の関数でやります。
4行目
int main(void){はmain関数であることを意味しています。プログラムを実行すると、まず、この中に入ります。そのため、main関数は必須です。最後の9行目の}までがmain関数であることを意味しています。
6行目
printf("Hello, World!\n");は表示をする関数(第4回でやります。)です。この場合はHello, World!と表示します。これがあるおかげでHello, World!と表示されています。\nは改行を意味します。
8行目
return(0);はプログラムを正常終了するためのものです。なくても、動作しますが、ないプログラムは好ましくないのでつけましょう。 return 0; というように書くことも出来ます。

とりあえず、1、3、4、8、9行にあるものは必須です。何回もプログラムを書けば自然と覚えられるので、少しずつ覚えていってください。
また、文の区切りには;(セミコロン)をつける必要があります。これをつけ忘れるようなミスで、コンパイルエラーになったりします。 改行にはソースコードを読みやすくする等の意味合いが含まれています。

つまり、改行を使わなくてもコンパイルは可能です。(※#include等のプリプロセッサ(第4回で解説します)ではこれは適用されません。)
コンパイル可能な例
#include<stdio.h>
int main(void);int main(void){printf("Hello, World!\n");return(0);}
コンパイル不可能な例
#include<stdio.h>int main(void);int main(void){printf("Hello, World!\n");return(0);}

つまり、このように改行をするのを減らすことも可能ですが、非常にソースコードが読みにくいです。 そのため、改行をつけるようにしましょう。

表示

では、C言語で何かを表示することについて説明します。とは言え、文字を表示する関数は複数個あります。それぞれ、場合によって使い分ける必要があります。 文字を表示する関数は3つあります。printf関数、puts関数、putchar関数です。

printf

printf関数は文字の表示、文字列の表示、さらにprintf("%d", 1);のようにして1を引数に渡す(関数に値を与える)ようなことも可能です。他にも文字や、文字列も同じようにして値を渡すことも可能です。はっきり言って、これが3つのうち一番使用する関数です。"(ダブルクォーテーション)で文字列を括って使用します。

puts

puts関数は文字の表示、文字列の表示が可能な関数です。また、改行文字を入れなくても、最初から末尾に改行が含まれています。printf関数のように引数に渡すようなことはできません。こちらも、"で文字列を括って使用します。

putchar

putchar関数は文字の表示ができる関数です。文字列の表示や、引数に渡す等はできません。これは'(シングルクォーテーション)で文字を括ります。

ではこれら3つで"RCC"と表示することにします。(改行含む)
下のプログラムは3つの関数で順番に表示したものです。

#include<stdio.h>

int main(void);

int main(void){
	
	printf("RCC\n");
	
	puts("RCC");
	
	putchar('R');
	putchar('C');
	putchar('C');
	putchar('\n');
	
	return(0);
}

実行結果

RCC
RCC
RCC

表示関数(標準出力関数)の使い分け

printfは変数を使うときに使います。そして、一番使い勝手がよいです。基本的にはこれを使用していればいいです。
putsは最後に改行をつける文字列を書きたいときに使います。とはいえ、printf関数があるので、あまり使う機会はないと思います。
putcharは1文字ずつ出力したいときに使います。後述する変数のchar型の変数を入れたりするときに使います。

printf関数の引数

次にprintf関数の引数に渡した時について少し説明します。
printf関数は、いくらでも引数を持つことができます。つまり、printf("%d %d %d %d %d %d %d %d %d %d\n", 1, 5, 4, 2, 7, 9, 6, 8, 10, 3);ということも可能です。 %dを含む、いろいろなものが引数に渡したものを表示する方法です。%cや、%xなどなど…その中でよく使うものを書いておきます。

%d 引数には数字、もしくは文字しか入れることができません。数字の場合はそのまま10進数の整数が出て、文字を入れた場合は文字コードの数字が表示されます。
%x 入れた数字が16進数になって表示されます。
%c 文字しか入れることができません。文字列は不可です。文字の'1'などは入れることができます。('1'を%dで表示した場合、文字コードの49が表示されます。)
%s 文字列(""で括られていればよい)ならなんでも表示してくれます。
%f 10進数の小数点以下があるものが表示できます。

以下にソースと実行結果を載せておきます。

#include<stdio.h>

int main(void);

int main(void){
	
	printf("1→%d\n", 1);
	
	printf("'a'→%d\n", 'a');
	
	printf("5→%x\n", 5);
	
	printf("11→%x\n", 11);
	
	printf("'a'→%c\n", 'a');
	
	printf("\"a\"→%s\n", "a");
	
	printf("\"1\"→%s\n", "1");
	
	printf("\"abc123\"→%s\n", "abc123");
	
	printf("RCC→%s\n", "RCC");
	
	printf("3.141592→%f\n", 3.141592);
	
	return(0);
}

実行結果

1→1
'a'→97
5→5
11→b
'a'→a
"a"→a
"1"→1
"abc123"→abc123
RCC→RCC
3.141592→3.141592

エスケープシーケンス

軽く触れましたが、\nのような通常は表記できないもの(エスケープシーケンスといいます)は他にもあります。以下に記しておきます。

\n 改行の意味があります。
\t タブコードです。
\0 文字列終了の意味があります。
\\ \を表示します。
\a 警報音を出します。
\% %を表示します。%%でも%を表示できます。

他にもありますが、特に使うのはこれくらいです。興味のある人は調べてみてください。

演算

では次に演算について説明します。演算は+-×÷なら…いいんですが、プログラムの場合は少し違います。

+→+
-→-
×→*
÷→/

また、剰余(割り算をしたときのあまりの数)を求めるための%というものもあります。優先順位は数学と一緒です。(剰余は*や/と同じ優先度)しかし、小数点の演算は数学とは少し違います。

では単純な四則演算と剰余の例のプログラムを書きます。

#include<stdio.h>

int main(void);

int main(void){
	
	printf("1 + 1 = %d\n", 1 + 1);
	
	printf("4 - 1 = %d\n", 4 - 1);
	
	printf("2 * 3 = %d\n", 2 * 3);
	
	printf("12 / 3 = %d\n", 12 / 3);
	
	printf("3÷2の余剰は%d\n", 3 % 2);
	
	return(0);
}

実行結果

1 + 1 = 2
4 - 1 = 3
2 * 3 = 6
12 / 3 = 4
3÷2の余剰は1

また、割り算の時の要注意として、割った結果を%dで表示するのと%fで表示するのでは大きく変わります。また、%fで表示する場合、 小数点で演算を行わないと、正常な数値が返ってきません。以下は例です。

#include<stdio.h>

int main(void);

int main(void){
	
	printf("%%dで3 / 2 = %d\n", 3 / 2);
	printf("%%fで3 / 2 = %f\n", 3 / 2);
	
	printf("%%dで3.0 / 2.0 = %d\n", 3.0 / 2.0);
	printf("%%fで3.0 / 2.0 = %f\n", 3.0 / 2.0);
	
	return(0);
}
実行結果
%dで3 / 2 = 1
%fで3 / 2 = 0.000000
%dで3.0 / 2.0 = 0
%fで3.0 / 2.0 = 1.500000

変数

今回の最後の話になりました。変数です。変数とは値を入れる箱のようなものです。 これはかなり重要なものです。まず、参考プログラムを用意しましたので、見てみましょう。

#include<stdio.h>

int main(void);

int main(void){
	
	int x;
	
	return(0);
}

このプログラムの場合、xが変数です。int x;は変数の型宣言と言って、この名前の変数をこの型(この場合はint)で使うという意味合いがあります。
変数宣言は、C言語の場合は、関数の一番最初にしか書くことはできません。つまり、演算や代入等を行った後に宣言はできないです。

それでは次は型について説明します。型にはいろいろと種類がありますが、その中でもよく使うものを挙げますと、int型、char型、float型です。

int型

int型は整数を扱いたい時に使います。int x = 1;と入れると、xに1が代入されます。また、int x = 2.5;と入れてもxには2しか入りません。int x = 'a';と代入すると、aの文字コードの数字(97)が入り、%cで表示するとaが表示されます。printfの引数に入れる場合は、%dや、%xを用いる必要があります。

char型

char型は文字を扱いたい時に使います。char c = 'a';や、char c = '1';と入れると、しっかりと代入されますが、char c = "RCC";は入りません。ちなみに、char c = '1'と代入して%dで表示すると文字コードが代入されます。 printfの引数に入れる場合は、%cを用いる必要があります。

しかし、char型の配列(第五章でやります)を使うと文字列を代入することができるようになります。 この場合はprintfに%sを用いる必要があります。

float型

float型は小数点を扱いたい時に使います。float f = 1;や、float f = 3.14;と入れると代入されますが、文字を入れると、int型と同様にその文字の文字コードが入ります。printfの引数に入れる場合は、%fを用いる必要があります。

double型

double型はfloat型よりもより精密な小数点を扱いたい時に使います。他はfloat型と一緒です。

代入演算子

代入はx = 1;のような形で代入することができます。これで、xという変数に1が代入されたことになります。
注意としては = は数学のように左辺と右辺が等しいことをさしているわけではなく、代入をさしています。この=を代入演算子と呼びます。
ちなみに、2 = x;や、a * b = 10;等では代入はできません。

変数の初期化

変数の初期化は重要です。変数の初期化とは変数の宣言時に最初から値を入れておくということです。例としては、int x = 7; といった感じです。 もし、変数の初期化を行わなかった場合、何が最初に代入されているかわからないので表示した場合の値は不定です。(静的変数staticや外部変数を除く)

変数名

変数名は基本的に自由につけることができますが、使えないものとして、型名(charや、intなど)や、_(アンダースコア)を除いた記号(-や、@、.など)、数字が名前の最初にあるもの(3paiや、2008yearsなど)があります。

型や変数の代入、変数名の例としてプログラムを用意しましたので、見てみましょう。

#include<stdio.h>

int main(void);

int main(void){
	
	int x;
	char c;
	float f;
	
	x = 7;
	
	printf("%d\n", x);
	
	x = 'a';
	
	printf("%d\n", x);
	
	x = 14;
	
	printf("%x\n", x);
	
	c = 'a';
	
	printf("%c\n", c);
	
	c = '1';
	
	printf("%c\n", c);
	
	f = 1.5;
	
	printf("%f\n", f);
	
	f = 'a';
	
	printf("%f\n", f);
	
	f = 1;
	
	printf("%f\n", f);
	
	return(0);
}

実行例

7
97
e
a
1
1.500000
97.000000
1.000000

変数の初期化を怠った場合、何が表示されるかみてみましょう。

サンプルソース

#include<stdio.h>

int main(void);

int main(void){
	
	int x;
	float f;
	char c;
	
	printf("x = %d\n", x);
	printf("f = %f\n", f);
	printf("c = %c\n", c);
	
	return(0);
}

実行結果(自分の環境ではこうなりました。)

x = 1
f = 0.000000
c = 

変数同士の演算

printfの引数内で変数同士の演算をすると、そのときの演算結果は表示されますが、変数の中身は変化しません。(中で変数に代入した場合を除く)しかし、例えば、xとyという変数があったとして、x = x + y;と書くと、xの中にxとyの加算をした結果が代入されます。

以下に例のプログラムを用意しました。

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 1, y = 2;
	
	printf("x + y = %d\n", x + y);
	
	printf("x = %d\ny = %d\n", x, y);
	
	x = x + y;
	
	printf("x + y = %d\n", x);
	
	printf("x = %d\ny = %d\n", x, y);
	
	x = x - y;
	
	printf("x + y = %d\n", x + y);
	
	printf("x = %d\ny = %d\n", x, y);
	
	return(0);
}

実行結果

x + y = 3
x = 1
y = 2
x + y = 3
x = 3
y = 2
x + y = 3
x = 1
y = 2

複合代入演算子

x = x + y;でxにyを足したものが代入できると説明しましたが、これは面倒です。それを解決したのが複合代入演算子です。 複合代入演算子は上で説明した +、-、*、/、等を =の前につけるだけでいいのです。x = x + y;を複合代入演算子で表現すると、 x += y;です。xにyを足しこむようなイメージでいいと思います。以下に例を示します。

サンプルソース

#include<stdio.h>

int main(void);

int main(void){
	
	int x = 0, y = 2, z = 3;
	
	printf("x = %d\n", x);
	
	x += y;
	
	printf("x = %d\n", x);
	
	x *= z;
	
	printf("x = %d\n", x);
	
	return(0);
}

実行結果

x = 0
x = 2
x = 6

次回予告

次回は制御構造のif文、switch文を中心に説明します。標準入力についても触れます。
また、次回からは最後に問題を出題します。

参考文献

e-Words(ASCII文字コード)

戻る