苦しんで覚えるC言語

単語と記号


予約語


C言語の基本的な予約語は以下の通りです。
予約語
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
コンパイラによっては、これ以外にも予約語を定義していることがあります。
また、C++コンパイラでは、C++の予約語も定義されています。
多くは普段使用する単語なので特に意識しなくてもわかりますし、
万一使ってしまってもコンパイラのエラーですぐに気づくと思います。

なお、予約語もマクロ名としては使用できてしまいますが、
混乱の元になるので使用してはいけません。

実は、main は予約語ではないので変数名などに問題なく使用できますが、
違和感があるのでわざわざ使うことはないと思います。

目次に戻る

出力変換指定子


出力変換指定子の書式と指定子に関する資料です。
printf関数などで使用されているものです。
変換指定子の書式
% オプション 長さ.精度 型
これらを、つなげて指定します。型以外の指定子は省略することが可能です。
一般的には、頭揃えの目的で長さのみを指定することが多いです。
なお、長さと精度の間の点は小数点です。カンマではありません。
ちなみに、精度と型の間にサイズに関する情報を持つ処理系もありますが、
これは、far,near ポインタ用で、明らかに時代遅れなので、取り扱いません。
オプション一覧
-  左詰めで表示
+  右詰めで表示
#  0、あるいは小数点の抑制を行わない。
長さと精度の書式
なお、長さの数値を L、精度の数値をPとします。
L  最低でもL桁で出力する。余白はスペースで埋める。
0L  最低でもL桁で出力する。余白は0で埋める。
L.P 全体を最低でもL桁、小数点以下をP桁で出力。
L.0 全体を最低でもL桁、小数点以下は出力しない。
※0は正確にはオプションですが、説明のため長さと精度に含めます。
型一覧
d,i  整数の10進数。
o   整数の8進数符号なし。
x,X  整数の16進符号なし。x は小文字、X は大文字で。
u   整数10進数符号なし。
f   実数。
e,E  実数の指数形式。e は小文字、E は大文字。
g,G  実数のサイズに応じて、通常出力か指数形式が選択される。
c   1文字。
s   文字列。ヌル文字まで出力。
p   ポインタのアドレスとして出力。16進大文字。
n   これまでに書き出された文字数の出力。型変換をしない。
%   文字 % の出力。型変換をしない。
double型の表示に使うのは、%fが正解です。
そもそも出力変換指定子には、%lfは存在していません。
しかし、現在では%lfでもほとんどのコンパイラで通ります。

目次に戻る

入力変換指定子


入力変換指定子の書式と指定子に関する資料です。
主に、scanf関数などで使用されているものです。
変換指定子の書式
% * 長さ サイズ 型
これらを、つなげて指定します。型以外の指定子は省略することが可能です。
一般的には、入力制限の目的で長さのみを指定することが多いです。
ちなみに、長さとサイズの間にポインタのサイズに関する情報を持つ処理系もありますが、
これは、far,near ポインタ用で、明らかに時代遅れなので、取り扱いません。

* を付けた場合、データを読み飛ばします。(変数に代入しません)
ファイルのデータを読み込む場合などに、不要なデータを飛ばすのに使います。

長さを指定すると、そのケタ数だけの数字(あるいは文字列)を読み込みます。
数字のケタ数の制限や、文字列バッファの領域を超えないようにするために使われます。
サイズ一覧
h  読み込んだデータをshort型に変換する。
l  読み込んだデータを型の指定に合わせて、long型かdouble型に変換する。
L  読み込んだデータをlong double型に変換する。
型一覧
d   int型の10進数。
o   int型の8進数。
x   int型の16進数。
i   int型。進数はデータにあわせて決定。
u   unsigned int型の符号なし10進数。
f   float型
e,E  float型の指数形式。e は小文字、E は大文字。
g,G  通常形式か指数形式。
c   char型の文字。
s   空白を含まないchar型の文字列。
p   ポインタの値。
n   これまでに読み込まれた文字数を代入。データを読み込まない。
%   何もしない。無意味な指定。
入力変換指定子は、代入を行うので型の指定が厳しくなります。
上の一覧にはdouble型がありませんが、
これはサイズ指定子のlと組み合わせて指定します。

目次に戻る

演算子と優先順位


Cの演算子の優先順位はとてもうまく考えられているので、
一般的な使用では、明示的に () を付ける必要はなく、
数式の通りに書くことでうまくいくことがほとんどです。
ただ、優先順位が不安な時は、この表を見て比べるよりも、
() を付けるのが簡単で確実です。

C言語の演算子と優先順位
上にあるものほど優先順位が高くなっています。
区切られた各部分の記号は同じ優先順位となります。
呼び方には特に決まりがありませんが、一般的だと思われる呼び名を使用しました。
名前記号機能結合規則項数
配列添字[]配列の要素番号の指定左から右単項
関数呼び出し()関数を呼び出す左から右単項
要素選択.構造体の要素を選択左から右単項
------------------------------
アロー->構造体ポインタの要素を選択左から右単項
後置インクリメント++変数の値を1増やすなし単項
後置デクリメント--変数の値を1減らすなし単項
前置インクリメント++変数の値を1増やすなし単項
前置デクリメント--変数の値を1減らすなし単項
参照*ポインタのさす変数にアクセスなし単項
アドレス&変数のアドレスにアクセスなし単項
単項プラス+正の値にするなし単項
単項マイナス-負の値にするなし単項
論理否定!真と偽の状態を反転なし単項
サイズオブsizeof変数や配列や型のサイズを取得なし単項
キャスト(型)指定の型に強制変換右から左単項
------------------------------
乗算*掛け算左から右2項
除算/割り算左から2項
剰余%余り左から右2項
------------------------------
加算+足し算左から右2項
減算-引き算左から右2項
------------------------------
左シフト<<変数の値を1ビット左にずらす(2倍)左から右単項
右シフト>>変数の値を1ビット右にずらす(半分)左から右単項
------------------------------
小なり<左側の値が右より小さい時に真左から右2項
大なり>左側の値が右より大きい時に真左から右2項
以下<=左側の値が右以下の時に真左から右2項
以上>=左側の値が右以上の時に真左から右2項
------------------------------
等価==左と右の値が等しい時真左から右2項
不等価!=左と右の値が異なる時真左から右2項
------------------------------
ビットAND&ANDを取る左から右2項
------------------------------
ビット排他的論理和^排他的論理和を取る左から右2項
------------------------------
ビットOR|ORを取る左から右2項
------------------------------
論理AND&&左と右の両方が真の時に真左から右2項
------------------------------
論理OR||左と右のどちらかが真の時に真左から右2項
------------------------------
条件?と:真の時は前式を、偽の時は後式を代入右から左3項
------------------------------
代入=左の変数に右の式の値を代入右から左2項
代入乗算*=左の変数に右の式との値の掛け算を代入右から左2項
代入除算/=左の変数に右の式との値の割り算を代入右から左2項
代入剰余%=左の変数に右の式との値の余りを代入右から左2項
代入加算+=左の変数に右の式との値を足し算を代入右から左2項
代入減算-=左の変数に右の式との値を引き算を代入右から左2項
左シフト代入<<=左の変数に右の式との値の左シフトを代入右から左2項
右シフト代入>>=左の変数に右の式との値の右シフトを代入右から左2項
ビットAND代入&=左の変数に右の式との値のANDを代入右から左2項
ビット排他的論理和代入^=左の変数に右の式との値の排他的論理和を代入右から左2項
ビットOR代入=左の変数に右の式との値のORを代入右から左2項
------------------------------
順次,式を結合左から右2項
下に、いくつかの演算子についての解説を付けておきます。

参照演算子とは、ポインタ変数を通常変数モードに切り替える演算子です。
なお、ポインタ変数を宣言する時に付ける*とは文法上は関連性はありません。

配列添字演算子とは、配列に付けられる[]のことを意味しており、
その機能はアドレスへ変数のバイトサイズ分の足し算を行うことです。
なお、配列を宣言する時に付ける[]とは文法上は関連性はありません。

条件演算子とは、条件式を簡単に作るものであり、下のように使用します。
条件演算子
変数 = ( 条件式 ) ? 式1 : 式2 ;
条件式が真の時は式1が実行され、偽の時は式2が実行されます。
そして、その結果が、変数に代入されますが、変数を指定しなくても使えます。
if文より条件判断を簡便に書けるので、これを好んで使用する(筆者も)人もいます。
なお、この演算子はC言語で唯一3項を使うので、3項演算子とも呼びます。

順次演算子とは、2つの式を1つにまとめてしまおうというものです。
順次演算子
j = (i = 3 , i + 2 );
この例では、先に i = 3 が計算され、次に i + 2 が計算されます。
最終的に、jには5が代入されることになります。
ただ、この演算子にはこれといった使い道がありません。

目次に戻る

記憶クラス指定子


C言語には、以下の記憶クラス指定子が用意されています。
しかし、すでに使われなくなったものも多いようです。
記憶クラス指定子
auto
register
static
extern
typedef
auto指定子
変数が自動変数であることを意味します。
しかし、関数の内部では自動的に自動変数になるし、
関数外ではエラーになるので無意味な指定子です。
register指定子
その変数が頻繁に使用されることを意味します。
昔はこの変数をレジスタに割り当てることで、
処理の高速化を行っていましたが、
現在ではコンパイラの最適化機能が優先されます。
マルチスレッドでの排他処理する変数を指定するキーワードとして流用されることがあります
static指定子
その変数がプログラム終了まで残り続けることを意味します。
関数内では、変数の値が関数の中で保持されるようになります。
関数外では、変数がそのソースファイルの中でだけ有効になります。
extern指定子
変数などの定義が他のソースファイルで行われていることを意味します。
ヘッダーファイル内で共通変数を宣言するのに使用されます。
typedef指定子
新しい型を宣言します。
型宣言を簡単に出来る上、コンパイラによるチェックも行えます。
※本来は記憶クラスとは無関係ですが文法の都合でここに含まれます。

目次に戻る

エスケープ文字


画面には表示できないけど、文字列の表示などを操作する目的で使われるものです。
改行を行う\nがなんといっても有名ですが、ほかにも次のようなものがあります。
エスケープ文字
エスケープ文字16進数機能
\a0x07ビープ音を鳴らす
\b0x08カーソル位置を1つ後ろにずらす
\t0x09カーソル位置を次のタブ位置に移動する
\n0x0Aカーソル位置を次の行に移動(改行)
\f0x0C紙を排出する(プリンタの場合のみ)
\r0x0Dカーソル位置を行の一番左に移動(Macでは改行)
\\0x5C\を表示する
\'0x2C'を表示する
\"0x22"を表示する
\?0x3F?を表示する
\数字8進数で同じ対応する8進数の文字コードを表示
\x数字数字と同じ対応する16進数の文字コードを表示
この中でよく使用されるのは\nと\tです。
\fは、プリンタへの出力の時にのみ使えますが、あまり一般的ではありません。
\rは、Macでは改行なので、現在では他のOSでも改行となります。

エスケープ文字は、その表記には2文字以上を使用しますが、
実際には、あくまでも1文字です。
目次に戻る

定義済み定数


C言語では、処理系の情報や、デバッグに使える情報などを、
定義済みの定数として用意しています。
デバッグ用定数
__LINE__  実行されている行番号
__FILE__  実行されているソースファイル名
__DATE__  コンパイルされた日付
__TIME__  コンパイルされた時刻
__FILE__ と __LINE__ を使うことで、プログラムの実行時に、
エラーの発生した行番号を突き止めることが可能です。
ログファイルに吐いたり、簡易デバッガに使うととても便利です。
整数型サイズの定義済み定数
これらの定数の使用には #define <limits.h> が必要です。
CHAR_BIT   char型のビット単位のサイズ。
CHAR_MAX   char型の最大値。
CHAR_MIN   char型の最小値。
INT_MAX   int型の最大値。
INT_MIN   int型の最小値。
LONG_MAX   long型の最大値。
LONG_MIN   long型の最小値。
SCHAR_MAX  signed char型の最大値。
SCHAR_MIN  signed char型の最小値。
SHART_MAX  short型の最大値。
SHART_MIN  short型の最小値。
UCHAR_MAX  unsigned char型の最大値。
UINT_MAX   unsigned int型の最大値。
ULONG_MAX  unsigned long型の最大値。
USHRT_MAX  unsigned short型の最大値。
char型を符号付にするかはコンパイラ依存です。
当然どちらでも文字の記憶には支障がないように作られています。

目次に戻る