C言語/基礎知識
出典: フリー教科書『ウィキブックス(Wikibooks)』
目次 |
[編集] 記法
C言語のプログラムを記述するにあたって、押えておきたい点がいくつかある。 次に基本的な記法をまとめた。
- C言語のプログラムは主に半角英数記号を使って記述される。
- 大文字と小文字は厳密に区別され異なる文字として扱われる。
- 30程度の予約済みのキーワードや、プログラマが自由に決める識別子(他の要素と区別するために付ける名前のこと)などの、字句と呼ばれるものを並べて記述される。
- 字句を並べたものを文と呼び、実行すべき動作を記述する。文は「;(セミコロン)」で終わる。基本的に上から下へ順番に実行される。
- いくつかの文をまとめたものをブロックと呼ぶ。ブロックは「{」ではじまり「}」で終わる。
[編集] 関数
C言語のプログラムは全て1つ以上の関数と呼ばれる処理単位から構成される。 関数とは、識別子を持ち、いくつかの文がブロックでまとめられた、サブルーチンである。 関数の記述は次のようになっている。
返却値のデータ型 関数の識別子(仮引数)
{
/*いくつかの文*/
}
関数の識別子とはその関数を他の関数と区別するために付ける名前のことで、 関数の識別子に使えるのは半角英数、「_(下線)」である。 ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかはコンパイラによる。
関数は他の関数の中で呼び出すことができる。 関数を呼び出す際の記述は次のようになっている。
関数の識別子(実引数)
関数を呼び出す際、関数の呼び出し元から呼び出し先へ情報を渡すことができ、この情報を引数と呼ぶ。 また、関数の呼び出し先から呼び出し元へ情報を渡すこともでき、この情報を返却値と呼ぶ。 引数や返却値についてはここではこれ以上説明しない。
[編集] main関数
main関数とはプログラムの開始処理において、 いろいろな初期化処理の後、最初に呼び出される関数である。 たいていのプログラムはこのmain関数から始まると考えてよい。 main関数には大まかに分けてプログラム引数を持たない関数と持つ関数との2種類の記述方法がある。
- プログラム引数とは
プログラムを実行する際、プログラムに対して渡される情報を、プログラム引数と呼ぶ。 例えばコマンドプロンプトにおいて、
C:\c\test>test.exe 123 456 789
のようにプログラムを実行した場合、 test.exeプログラムのmain関数に対して、 「test.exe」、「123」、「456」、「789」という4個の文字列が渡される。
- プログラム引数を持たない関数
プログラム引数を使用しない場合、次のように仮引数をもたない関数を記述する。
int main(void)
{
/*いくつかの文*/
}
- プログラム引数を持つ関数
プログラム引数を使用する場合、次のように2つの仮引数をもつ関数を記述する。
int main(int argc, char *argv[])
{
/*いくつかの文*/
}
argcはプログラム仮引数の個数である。 argvはプログラム仮引数を表す文字列へのポインタである。 argv[0]が指す文字列はプログラム名である。 argcにはこのプログラム名も個数として数えられる。 文字列やポインタについてはここではこれ以上説明しない。
[編集] データ型と変数の宣言・代入・参照
変数とはデータを格納しておく領域、またはその個々の領域に付けられた識別子のことである。 変数はふつうメモリ上に確保され、値を代入したり参照したりすることができる。 変数を使用するには前もって宣言をする必要がある。 変数の宣言の記述は次のようになっている。
変数のデータ型 変数の識別子;
変数のデータ型とは、メモリ上に確保する領域のビット長や、確保した領域の扱い方などを決定するものである。データ型は扱いたいデータの種類や値の範囲によって決定する。 変数の識別子とはその変数を他の変数と区別するために付ける名前のことで、 変数の識別子に使えるのは、半角英数、「_(下線)」である。 ただし、先頭は非数字でなければならない。 多バイト文字を使用できるかはコンパイラによる。
【下の表を参照しつつ読むこと】データ型には型なし、文字型、整数型、実浮動小数点型、などがある。 型なしとは値を持たない特殊なデータ型でvoidを用いる。 文字型とは1バイト文字を格納するためのデータ型でcharを用いる。また、小さな整数を格納するためにも用いられる。負の数も扱う場合にはsignedを先頭に付ける。 整数型とは整数を格納するためのデータ型でintを用いる。整数型には扱う値の範囲に応じて様々な種類が存在する。扱う値の範囲が狭い順にshort int, long int, long long intなどがある。 負の数を扱わない場合にはunsignedを先頭につける。 実浮動小数点型とは浮動小数点数を格納するためのデータ型でfloatまたはdoubleを用いる。浮動小数点数とは有効数字部と指数部とによる実数の近似値の表現方式である。またfloatとdoubleとではdoubleのほうが精度が高い。
- 次に主なデータ型を表にまとめた。ビット長及び扱える値の範囲は処理系によって異なる場合がある。以下は主な32ビット処理系の場合である。実際のビット長及び扱える値の範囲はlimits.h及びfloat.hにより確認できる。
| データ型の種類 | データ型 | データ型の名称 | ビット長 | 扱える値の範囲 |
|---|---|---|---|---|
| 型なし | void | void型 | - | - |
| 文字型 | signed char | 符号付き文字型 | 8 | -128~127 |
| (unsigned) char | (符号無し)文字型 | 8 | 0~255 | |
| 整数型 | (signed) short int | (符号付き)短整数型 | 16 | -32768~32767 |
| unsigned short int | 符号無し短整数型 | 16 | 0~65535 | |
| (signed) int | (符号付き)整数型 | 32 | -2147483648~2147483647 | |
| unsigned int | 符号無し整数型 | 32 | 0~4294967295 | |
| (signed) long int | (符号付き)長整数型 | 32 | -2147483648~2147483647 | |
| unsigned long int | 符号無し長整数型 | 32 | 0~4294967295 | |
| (signed) long long int | (符号付き)長長整数型 | 64 | -9223372036854775808~9223372036854775807 | |
| unsigned long long int | 符号無し長長整数型 | 64 | 0~18446744073709551615 | |
| 実浮動小数点型 | float | 単精度実浮動小数点型 | 32 |
分解能1.175494351e-38、 最大値3.402823466e+38 |
| double | 倍精度実浮動小数点型 | 64 | 分解能2.2250738585072014e-308、最大値1.7976931348623158e+308 |
※データ型の「()」は省略可能であることを表す。
※signed int型及びunsigned int型のビット長は処理系により異なる場合が特に多い。
一般に16ビット処理系ならば16ビット、32ビット処理系ならば32ビットである。
変数にデータを格納することを代入と呼ぶ。 代入の記述は次のようになっている。
変数の識別子=式;
「=」は代入演算子と呼ばれ、変数の識別子が指す変数に式の値を代入する。 数学における等号とは異なる用法であるので注意せよ。 式とは定数、変数、関数の返却値などを演算子を使って結合したものである。
変数に格納されたデータを使用することを参照と呼ぶ。 参照の記述は次のようになっている。
変数の識別子
[編集] 定数
定数とはプログラム実行時に一定の値しかもたない数である。 変数の値がプログラム実行中に変更される場合もあるのに対して、 定数の値はプログラム実行中を通して一定である。 ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ。 ここではそのリテラルについて説明する。
【下の表を参照しつつ読むこと】定数には整数定数、浮動小数点定数、文字定数、文字列定数、などがある。 整数定数とは整数を記述するための定数である。主に10進数表記が使われるが、必要に応じて16進数表記が使われることもある。16進数表記では接頭辞として0xを付ける。 浮動小数点定数とは浮動小数点数を記述するための定数である。主に10進数の小数点数表記で記述するが、必要に応じて有効数字部と指数部で記述することもある。 文字定数とは1バイト文字を記述するための定数である。半角英数記号や半角カタカナなどが記述できる。 文字列定数とは1バイト文字または多バイト文字の文字列を記述するための定数である。C言語では文字列は文字の配列として扱われるが、ここではこれ以上説明しない。
- 次に主な定数を表にまとめた。
| 定数の種類 | 進数 | 記法 | 例 |
|---|---|---|---|
| 整数定数 | 8進数 | 「0」に続く8進数 | 02322 // 10進数で1234のこと |
| 10進数 | 10進数 | 1234 | |
| 16進数 | 「0x」に続く16進数 | 0x4d2 // 10進数で1234のこと | |
| 浮動小数点定数 | 10進数 | 10進整数部と「.」と10進小数部 10進有効数字部と「e」と10進指数部(10のべき乗) |
3.14 1e-3 // 0.001のこと |
| 16進数 | 「0x」に続く16進整数部と「.」と16進小数部と「p」と10進指数部(2のべき乗) 「0x」に続く16進有効数字部と「p」と10進指数部(2のべき乗) |
||
| 文字定数 | - | 「'(一重引用符)」で囲まれた文字 | 'a' |
| 文字列定数 | - | 「"(二重引用符)」で囲まれた文字列 | "Hello, World!" |
知ってた?8進数のナゾ:Alternative 笑門来福:ITmedia オルタナティブ・ブログ http://blogs.itmedia.co.jp/pina/2006/06/8_bf7b.html
[編集] 算術演算子と代入演算子
演算子とは演算の内容を指示する記号である。 C言語には非常に多くの演算子が存在するが、 ここでは算術演算子と代入演算子についてだけ説明する。
【下の表を参照しつつ読むこと】算術演算子とは加減乗除などの算術を指示する演算子である。 算術演算子には、加法を指示する+、減法を指示する-、乗法を指示する*、除法を指示する/、剰余を指示する%、などがあり、 また、-は符号の反転を指示するためにも用いられる。 代入演算子とは代入を指示する演算子である。 代入演算子には右辺の値を左辺が指す変数へそのまま代入するように指示する=がある。
- 次に算術演算子と代入演算子を表にまとめた。
| 演算子の種類 | 演算子 | 演算子の名称 | 意味 |
|---|---|---|---|
| 単項演算子 | + | 単項+演算子 | 右オペランドの値 |
| - | 単項-演算子 | 右オペランドの符号を反転した値 | |
| 乗除演算子 | * | 2項*演算子 | 左右オペランドの積 |
| / | 2項/演算子 | 左オペランドを右オペランドで除した商 右オペランドの値が0の場合、その動作は未定義である。 左右オペランドが整数型の場合、商の小数部は切り捨てられる。 |
|
| % | 2項%演算子 | 左オペランドを右オペランドで除した剰余 右オペランドの値が0の場合、その動作は未定義である。 左右オペランドは整数型でなければならない。 |
|
| 加減演算子 | + | 2項+演算子 | 左右オペランドの和 |
| - | 2項-演算子 | 左オペランドから右オペランドを引いた差 | |
| 代入演算子 | = | 単純代入演算子 | 左オペランドが指す変数に右オペランドの値を格納する |
※演算子の種類は演算子の優先順位の順番に並んでおり、上の項目ほど優先順位が高い。
また、同じ演算子の種類では式の左側にあるものが優先される。
※数学と同様に()で囲むことにより優先させることができる。
※オペランドとは、演算子が操作を行う対象のことであり、
定数、変数、関数の返却値、及びオペランドと演算子の組み合わせなどがオペランドとなりうる。
[編集] 標準ライブラリ
標準ライブラリとは、プログラミングでよく使われる処理がまとめられたもので、 代表的なものには、入出力(stdio.h)、文字列操作(string.h)、数学(math.h)などがある。 標準ライブラリはC言語のほとんど全ての機能を使って実装されているため、 完全に説明できるのは教科書の最後のほうとなってしまう。 しかし、入力と出力とを行うことはプログラミングの初期においても必須なものであるため、 入出力(stdio.h)の内、printf関数とscanf関数とについては、ここでその使い方を簡単に説明する。
[編集] 前処理指令
前処理指令とはコンパイルの翻訳過程において、翻訳の前に行われる処理のことで、#前処理字句からはじまる1行を指す。 翻訳の前に行われる処理には、ソースファイルの1部分を条件によって読み飛ばしたり、 他のソースファイルを組み込んだり、マクロを置き換えたりする、などがある。 主にソースファイルの宣言部分をまとめて、他のファイルから使いやすくしたものをヘッダファイルと呼ぶ。 標準ライブラリを使用するためには、使用する標準ライブラリに応じたヘッダファイルを組み込む必要がある。 ヘッダファイルを組み込むには前処理指令の内の1つである#include指令を用いる。 printf関数及びscanf関数を使用するためには、stdio.hというヘッダファイルを組み込む必要がある。 stdio.hを組み込むためには、ソースファイルの先頭で、次のように記述する。
#include <stdio.h>
[編集] printf関数
printf関数とは、標準出力に対して書式付の文章を書き込む関数である。 標準出力はデフォルトでコンソール画面である。 printf関数の記述は次のようになっている。
printf(書式付の文字列定数, 任意個数の実引数...);
書式付の文字列定数には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。 書式付の文字列定数に含まれる変換指定の部分が、それに対応する後の実引数の値によって置換される。
- 次に主な変換指定を表にまとめた。
| 変換指定 | 意味 |
|---|---|
| %d, %i | 実引数を符号付き10進表記に変換する |
| %u | 実引数を符号無し10進表記に変換する |
| %o | 実引数を符号無し8進表記に変換する |
| %x, %X | 実引数を符号無し16進表記に変換する %xは英字abcdefを、%Xは英字ABCDEFを用いる |
| %f, %F | 実引数を小数形式の10進浮動小数点数表記に変換する |
| %e, %E | 実引数を指数形式の10進浮動小数点数表記に変換する |
| %g, %G | 実引数を小数形式または指数形式の10進浮動小数点数表記に変換する |
| %a, %A | 実引数を指数形式の16進浮動小数点数表記に変換する |
| %c | 実引数を文字に変換する |
| %s | 実引数を文字列に変換する |
| %p | ポインタの値に変換する |
| %n | 整数変数に出力した文字数を格納する |
| %% | 「%」を出力する |
[編集] scanf関数
scanf関数とは、標準入力に対して、その入力を書式付の文章に従って読み込む関数である。 標準入力はデフォルトでキーボードである。 scanf関数の記述は次のようになっている。
scanf(書式付の文字列定数, 任意個数の実引数...);
書式付の文字列定数には、それに続く任意個数の実引数と同じ数だけの変換指定が含まれなければならない。 標準入力からの入力が、書式付の文字列定数に含まれる変換指定に従って、それに対応する後の実引数が指す変数に代入される。 任意個数の実引数では、単項&演算子を用いて、次のように記述する。
&変数の識別子
これはscanf関数の内部で、この変数の識別子が指す変数に対して代入するために必要な記述である。 単項&演算子については、ここではこれ以上説明しない。
- 次に主な変換指定を表にまとめた。
| 変換指定 | 意味 |
|---|---|
| %d | 入力を符号付き10進整数に変換する |
| %i | 入力を符号付き整数に変換する |
| %u | 入力を符号無し10進整数に変換する |
| %o | 入力を符号無し8進整数に変換する |
| %x | 入力を符号無し16進整数に変換する |
| %a, %e, %f, %g | 入力を浮動小数点数に変換する |
| %c | 入力を文字に変換する |
| %s | 入力を文字列に変換する |
| %p | 入力をポインタの値に変換する |
| %n | 整数変数に入力した文字数を格納する |
| %% | 1つの%と照合する |
scanf関数の実用には様々な問題を解決する必要があるが、ここではこれ以上説明しない。
[編集] 脚注
- ^ 『JISX3010:2003』p.51「6.5.2.2 関数呼び出し」
- ^ 『JISX3010:2003』p.107「6.9.1 関数定義」
- ^ 『JISX3010:2003』p.8「5.1.2.2.1 プログラム開始処理」
- ^ 『JISX3010:2003』p.16「5.2.4.2.1 整数型の大きさ<limite.h>」
- ^ 『JISX3010:2003』p.17「5.2.4.2.2 浮動小数点型の特性<float.h>」
- ^ 『JISX3010:2003』p.25「6.2.5 型」
- ^ 『JISX3010:2003』p.72「6.7.2 型指定子」
- ^ 『JISX3010:2003』p.39「6.4.4 定数」
- ^ 『JISX3010:2003』p.45「6.4.5 文字列リテラル」
- ^ 『JISX3010:2003』p.48「6.5 式」
- ^ 『JISX3010:2003』p.50「6.5.1 一次式」
- ^ 『JISX3010:2003』p.58「6.5.3.3 単項算術演算子」
- ^ 『JISX3010:2003』p.60「6.5.5 乗除演算子」
- ^ 『JISX3010:2003』p.60「6.5.6 加減演算子」
- ^ 『JISX3010:2003』p.67「6.5.16 代入演算子」
- ^ 『JISX3010:2003』p.110「6.10 前処理指令」
- ^ 『JISX3010:2003』p.113「6.10.2 ソースファイル取込み」
- ^ 『JISX3010:2003』p.210「7.19.6.3 printf関数」
- ^ 『JISX3010:2003』p.198「7.19.6.1 fprintf関数」
- ^ 『JISX3010:2003』p.204「7.19.6.2 fscanf関数」
- ^ 『JISX3010:2003』p.210「7.19.6.4 scanf関数」