C言語講座

第2回

C言語では一度に実行できる命令を式といいます。 具体的にはこの後にある宣言式や代入式などです。 ここで重要なのは式は;で終わらなければならにということです。 ちなみにC言語において改行は空白と同じ意味です。

たとえば

 int i
 i=0;

は一つの式となり同時に実行できない宣言式と代入式なのでエラーになります。

変数

プログラムにおいて何かを記憶しておかなければならないという状況は多々あります。 コンピュータではメモリに記憶しますが、プログラムでは記憶することを宣言しなければなりません。 ここで宣言されたメモリ上の記憶領域を変数といいます。

*つまり何かを記憶したいと思ったら、変数を宣言する必要があるということです。

変数の宣言

ではC言語において変数の宣言方法です。

型 変数名;

まずはこれだけ覚えておきましょう。 ちなみに

型 変数名1,変数名2...

とすると一度に同じ型の変数を複数作ることができます。

変数に記憶できるものは結局のところ0と1のビット列でしかありません。 そこでコンピュータは0と1の組み合わせで様々なものを表します。 ところで次を見てください。

11100111101101000010111110111000

このビット列は整数とすると-407621720 実数とすると1.1となり区別がつきません。 そこで変数に型をつけることでその変数が何であるかを指定します。

型の種類

型としては代表的な以下のものがあります。

型名 表せる範囲 用途
int -2147483648~2147483647 整数を表す
char -128~127 文字を表す。
double $\pm 1.7 * 10^{-308} ~ 1.7*10^{308} $ 浮遊動小数点を表す

ここで浮遊動小数点について補足しておきます。 コンピュータはすべてが有限なもので作られています。 そのため無限な実数を表すには無理があり、ある程度妥協したものが浮遊動小数点です。 あまりに大きな数や小さな数は表せません。

以下ようなものもあります。

代入

これで変数を作ることができました。 しかし変数の中身は空っぽです。 そこで変数の中身を指定しましょう。

変数名 = 値;

これで変数の中身が値となります。 このように変数の中身を変更することを代入といいます。

初期化

変数を宣言したときその中身は不定です。 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&amp;&amp;j==g

とした場合i==kとj==gはどちらも正でなければ正になりません。 しかし

i==k||j==g

とした場合i==kかj==gのどちらかが正なら正になります。

その他

()でくくることもできます。その場合後に説明する優先規則によって()の中が先に計算されます。

変数名++;

とするとその変数に1加算されます。これをインクリメントといいます。

逆に

変数名--;

とするとその変数から1引かれます。これをデクリメントといいます。

sizeof(変数名)とするとその変数がメモリ上でどのくらいの大きさがあるかわかります。

演算の結果はその演算の中で最も表せる範囲の大きい型になります。 たとえば

int i=5,j=10;
i= i/j;

とすると一番表せる範囲の大きい型はint型なので0.5は表せずiは0になります。

しかし

int i=5;
double j=10
j=i/j;

とすると一番表せる範囲の大きい型はdouble型なのできちんと0.5となります。 ちなみにiに代入しようとするとintよりdoubleのほうが大きいので入れることができずエラーになります。

優先順位と結合規則

数学では乗除算は加減算より先に計算しなければなりませんでした。 C言語でも同じように演算子には優先順位が設定されています。 また数学では基本的に左から右へ計算していきました。 C言語でも先にどちらを実行するかが決められています。 たとえば

a=b=c=d=0;

とすると

d=0

c=d

b=c

a=b

の順で実行されます。

各演算子における優先順位と結合規則は以下のとうりです。表の上に行くほど優先されます。

演算子 種類 結合規則
() [] . -> 左から右
! * & ++ -- + - sizeof(cast) 単項演算子 右から左
* / % 乗除 左から右
+ - 加減 左から右
<< >> シフト 左から右
< > <= >= == != & ^ | 比較 等価 ビットAND ビットOR ビットXOR 左から右
&& 論理積 左から右
|| 論理和 左から右
= *= /= %= -= += <<= >>= &= |= ^= 代入演算子 右から左
, カンマ演算子 左から右

##演習 変数を出力するためには

   printf("%d\n",変数名);

とします。

1. int型の変数i,j,kを作りそれぞれ4,58,546を代入し出力せよ。

2. 先ほどのi,j,kの合計をlに代入し出力せよ。

3. 以下の式の実行順序を説明せよ。

   int i=5;
   i+= (8+5*2)+(6<=i||3==i&&4>i)*2%1;

4. 以下の出力が0になる理由を説明せよ。

    int i=4,j=50;
    i=4/50;
    printf("%d\n",i);


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS