C言語では一度に実行できる命令を式といいます。 具体的にはこの後にある宣言式や代入式などです。 ここで重要なのは式は;で終わらなければならにということです。 ちなみにC言語において改行は空白と同じ意味です。
たとえば
int i
i=0;
は一つの式となり同時に実行できない宣言式と代入式なのでエラーになります。
プログラムにおいて何かを記憶しておかなければならないという状況は多々あります。 コンピュータではメモリに記憶しますが、プログラムでは記憶することを宣言しなければなりません。 ここで宣言されたメモリ上の記憶領域を変数といいます。
*つまり何かを記憶したいと思ったら、変数を宣言する必要があるということです。
ではC言語において変数の宣言方法です。
型 変数名;
まずはこれだけ覚えておきましょう。 ちなみに
型 変数名1,変数名2...
とすると一度に同じ型の変数を複数作ることができます。
変数に記憶できるものは結局のところ0と1のビット列でしかありません。 そこでコンピュータは0と1の組み合わせで様々なものを表します。 ところで次を見てください。
11100111101101000010111110111000
このビット列は整数とすると-407621720 実数とすると1.1となり区別がつきません。 そこで変数に型をつけることでその変数が何であるかを指定します。
型としては以下のものがあります。
型名 | 表せる範囲 | 一般的な使用バイト | 用途 |
---|---|---|---|
char | -128~127 | 1 | 文字を表す。 |
short int | -32768~32767 | 2 | 整数を表す |
int | -2147483648~2147483647 | 4 | 整数を表す |
long int | -2147483648~2147483647 | 4 | 整数を表す |
float | $\pm 3.4 * 10^{-38} ~ 3.4*10^{38} $ | 4 | 浮動小数点を表す |
double | $\pm 1.7 * 10^{-308} ~ 1.7*10^{308} $ | 8 | 浮動小数点を表す |
long double | $\pm 3.4 * 10^{-4932} ~ 1.1*10^{4932} $ | 10 | 浮動小数点を表す |
ここで浮動小数点について補足しておきます。 コンピュータはすべてが有限なもので作られています。 そのため無限な実数を表すには無理があり、ある程度妥協したものが浮遊動小数点です。 あまりに大きな数や小さな数は表せません。
基本的にchar,int,doubleを使っていけばいいでしょう。
これで変数を作ることができました。 しかし変数の中身は空っぽです。 そこで変数の中身を指定しましょう。
変数名 = 値;
これで変数の中身が値となります。 このように変数の中身を変更することを代入といいます。
変数を宣言したときその中身は不定です。 0であることが多いですが家臣はできません。 そこで変数は宣言と同時に中身を決めることができます。
型 変数名 = 値;
こうすることで変数を宣言すると同時に中身を決めることができます。
例
int i = 5;
これでint型の変数iが5を記憶した状態で宣言されました。
当然ながら
int i=5,j=6;
のようにすると一度に複数初期化できます。
変数は数字ですから当然計算することができます。 C言語における四則演算は次のようになっています。
int i,j
とすると 足し算:
i=i+j;
引き算:
i=i-j;
掛け算:
i=i*j;
割り算:
i=i/j;
このようにするとそれぞれの計算結果がiに入ります。
また代入する値は決まった数字ではなく、式を書くことができることがわかります。
C言語で使える演算子は以下のとうりです。
記号 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | あまり |
<< | 左シフト |
>> | 右シフト |
& | ビットAND |
| | ビットOR |
^ | ビットXOR |
自分自身の値を使って自分を更新する。つまり
i=i+j;
のような状況では、演算と代入を一緒にすることができます。
i+=j;
演算子の数だけ用意されており以下のようになっています。
記号 | 説明 |
---|---|
+= | 加算 |
-= | 減算 |
*= | 乗算 |
/= | 除算 |
%= | あまり |
<<= | 左シフト |
>>= | 右シフト |
&= | ビットAND |
|= | ビットOR |
^= | ビットXOR |
変数は別の変数や数字と比較することができます。 その際比較が正しい場合は0以外、間違っている場合は0が値となります。
例
int i=1,j=2,k;
k=i==j;
この時kは0になります。
比較演算子は以下のとうりです。
記号 | 説明 |
---|---|
< | 左より右が大きい |
> | 左より右が小さい |
<= | 左が右以上 |
>= | 左が右以下 |
== | 左と右は等しい |
!= | 左と右は異なる |
比較した結果はつなげることができます。 たとえば
i==k&&j==g
とした場合i==kとj==gはどちらも正でなければ正になりません。 しかし
i==k||j==g
とした場合i==kかj==gのどちらかが正なら正になります。
ある型の変数を別の型に変換することが出来ます。
(変数の型)値
とすると値がカッコ内の変数の型に変換されます。 また数値型については省略することが可能です。
ここで気をつけなければならないのが、ただしく変換できるとは限らないとういことです。 例えばint型からdouble型に変換してもきちんと変換されますが、その逆だと小数点以下は切り捨てになります。
たとえば
int i=5,j=10;
i= i/j;
とすると0.5は表せずiは0になります。
()でくくることもできます。その場合後に説明する優先規則によって()の中が先に計算されます。
変数名++;
とするとその変数に1加算されます。これをインクリメントといいます。
逆に
変数名--;
とするとその変数から1引かれます。これをデクリメントといいます。
sizeof(変数名)とするとその変数がメモリ上でどのくらいの大きさがあるかわかります。
数学では乗除算は加減算より先に計算しなければなりませんでした。 C言語でも同じように演算子には優先順位が設定されています。 また数学では基本的に左から右へ計算していきました。 C言語でも先にどちらを実行するかが決められています。 たとえば
a=b=c=d=0;
とすると
d=0
c=d
b=c
a=b
の順で実行されます。
各演算子における優先順位と結合規則は以下のとうりです。表の上に行くほど優先されます。
演算子 | 種類 | 結合規則 |
---|---|---|
() [] . -> | 式 | 左から右 |
! * & ++ -- + - sizeof(cast) | 単項演算子 | 右から左 |
* / % | 乗除 | 左から右 |
+ - | 加減 | 左から右 |
<< >> | シフト | 左から右 |
< > <= >= == != & ^ | | 比較 等価 ビットAND ビットOR ビットXOR | 左から右 |
&& | 論理積 | 左から右 |
|| | 論理和 | 左から右 |
= *= /= %= -= += <<= >>= &= |= ^= | 代入演算子 | 右から左 |
, | カンマ演算子 | 左から右 |
変数を出力するためには
printf("%d\n",変数名);
とします。
int型の変数i,j,kを作りそれぞれ4,58,546を代入し出力せよ。
先ほどのi,j,kの合計をlに代入し出力せよ。
以下の式の実行順序を説明せよ。
int i=5;
i+= (8+5*2)+(6<=i||3==i&&4>i)*2%1;
int i=4,j=50;
i=4/50;
printf("%d\n",i);