変数と変数名

Cでは変数は値を持った箱と理解すると分かりやすい。箱の名前が変数名で、箱の中身が値と考える。変数名にはなるべく中身が分かりやすい名前を付ける。例えばテストの平均を入れる箱にはtest_aveという名前をつける。ただし、幾つかの制約があるので気をつける。例えば、変数名の最初の文字は英字か下線( _ )でなければならないとかキーワード(予約語)であってはならないなどである。ソフトウェア工学の観点から、プログラムを習い始めたときに、他の人が読みやすいプログラムを書く習慣を身に付けるようにしよう。

 

データ宣言の書式

Cでは変数を入れる箱の型を決める必要がある。もし、変数test_timesがテストの回数を表すとしよう。この場合、テストの回数は1,2,3…という整数なので、整数をしまっておく箱は整数型であると宣言する。例えば、

              int test_times;

と書く。また、test_aveがテストの平均だとすると、小数になる可能性があるので、test_aveをしまっておく箱は実数型であると宣言する。例えば、

              float test_ave;

と書く。

しかし、テストの回数が2の15乗を超えるようであれば、intではまずい。そのときはlongを用いる。このように、箱に入る中身によってそれに見合った箱を用意できるようになっている。下にCで用いる箱の型を挙げておく。取り合えず、基本型をマスターしておこう。

 

データ型

基本型

(文字型と整数型にはunsignedがある)

 

 

構造を持つ型

ポインタ型

 

 

文字型

整数型

実数型

型なし   

列挙型 

配列型

構造体

共用体

 

char

short

int

long

float

double

long double

void

enum

[ ]

struct

union

*

 

文字型(character types)

文字型は文字’A’や桁数’8’などをあらわすときに用いる。例えば、Aという文字を文字型cに代入するときには、

 char c = ‘A’;

と書く。文字Aを文字型として使用するときは、アポストロヒィー( ‘ )が必要である。なぜなら、文字型もメモリーに保存されるときには、ASCIIコードと呼ばれる整数で保存される。アポストロヒィーはそのための役割をしている。ここで、

 printf(“%d”,c);

とすると、65を表示する。

 

整数型の算術

C++は次の5つのオペレータで算術の計算を行う。+,-,*,/,%。例えば、次のプログラムの結果はどうなるか考えてみよう。

#include<stdio.h>

void main(void)

{

    int m = 65;

    int n = 20;

    printf(“m = %d, n = %d\n”,m,n);

    printf(“m+n = %d\n”, m+n);

    printf(“m-n = %d\n”,m-n);

    printf(“m*n = %d\n”,m*n);

    printf(“m/n = %d\n”,m/n);

    printf(“m%n = %d\n”,m%n);

}

m = 65 and n = 20

m+n = 85

m-n = 34

m*n = 1300

m/n = 3

m%n = 5

たぶん注意しなければならないのは、m/nm%nの2つであろう。mnが整数のとき、m/nは商を表し、m%nはあまりを表す。

 

増加と減少演算子

++- -演算子は演算を行う数の前におくか後ろにおくかで意味が異なることに注意しよう。

例えば、

int m, n;

m = 44;

n = ++m;

と書くと、m = 45, = 45となる。つまり、n = ++mは先にmの値を1増やし、それをnに代入する。また、n = m++;と書くと、m = 45, = 44となる。つまり、n = m++はmの値を先にnに代入し、その後にmの値を1増やす。

++mm++も、ともにm = m+1のことであるが、m = m+1 とはほとんど書かないので、++- -の使い方に慣れておこう。

 

浮動小数点型(floating-point types)

実数を表すのに用いられる型である。

例えば10進数13.75が与えられたとする。これをコンピュータはどう扱うか見てみよう。まず、10進数13.75は2進数に変換される。

              13.75 = (8+4+1) + (1/2 + 1/4) = 1101.112

次に、少数点をいちばん左まで移動する。つまり4ビットの移動を行うので、

              13,75 = +0.110111×24

書き直すと

              13.75 = 0110111010000

このとき、最初の0は符号が正であることを表し、次の6桁は少数の本体を表し、次の6桁は指数を表す。指数の最初の数字は符号を表す。一般に32ビットの浮動少数点型では、最初の1ビットが符号、次の23ビットが少数本体、残りの8ビットが指数を表している。ちなみに64ビットの double型では、少数本体には52ビットが割り当てられ、11ビットが指数に割り当てられる。

 

浮動小数点型の算術計算は、整数型と異なり+,-,*,/の4種類で、普通の少数の計算と同じである。

ただし、C言語では四則演算はすべてdouble型で行われるので、実数型は、特に理由がない限り、doubleを用いるようにしよう。

 

データ型のサイズ

データ型のサイズは

              sizeof 変数名

              sizeof(型名)

で調べることができる。自分の処理系のデータ型を調べておこう。

 

例題2.1 自分の処理系のデータ型を調べておこう。

実行結果

          

解答

#include <stdio.h>

 

void main()

{

             printf("sizeof(char) = %d\n",sizeof(char));

             printf("sizeof(short) = %d\n",sizeof(short));

             printf("sizeof(int) = %d\n",sizeof(int));

             printf("sizeof(long) = %ld\n",sizeof(long));

             printf("sizeof(float) = %ld\n",sizeof(float));

             printf("sizeof(double) = %ld\n",sizeof(double));

             printf("sizeof(long double) = %ld\n",sizeof(long double));

 

}

 

例題2。2 基本型

    char ;        /* 文字型符号付*/

    int i;           /* 整数符号付*/

    unsigned int u;  /* 整数符号なし*/

    long l;         /* 長い整数符号付*/

    float f;         /* 実数符号付*/

    double d;      /*倍精度実数符号付*/

charcharacter(文字)の略、int integer(整数),floatfloat(浮動小数点)voidvoid()のことである。

キャッチ

 使っているコンパイラやコンピュータによって整数型のshort , int, long, float,doubleが扱える範囲が異なる。

目安として、パソコンを使っている人はshort,intともに-32768~32767,long-2147483648~2147483647,floatで4

バイト、doubleで8バイト、long doubleで10バイト。

 

Printfの書式

printfの書式制御文字一覧

名称

文字

意味

備考

負記号

左詰めを指定

省略可

出力幅1

整数

文字列の桁数の最小値を指定

省略可

出力幅2

整数

浮動小数点の場合には小数点以下の桁数

省略可

修飾子

 

引数の型d,i,o,u,xを修飾し引数がshort

省略可

d,i,o,u,xを修飾し引数がlong

e,f,gを修飾し引数がdouble

L

e,f,gを修飾し引数がlong double

引数の型

 

 

d,i,o,x

10進数、10進数、8進数、16進数

省略不可

u

符号なし10進数

c

1文字

s

文字列および文字配列

e,f,g

浮動小数点

p

ポインタ値

使い方

a=123.e-8; 

printf(“%3.10lf”,a);

と書くと0.0000012300と表示される。

 

練習問題2.1 以下のプログラムの実行結果がどうなるか考えよ。

#include <stdio.h>

void main(void)

{

                 char  c;

                 int    i;

                 c = ‘A’;

                 printf(“\nc=%c”,c);

                 i = (int)c;

                 printf(“\ni=%d”,i);

                 printf(“\ni=0x%x”,i);

                 i= 66;

                 printf(“\ni=%d”,i);

                 printf(“\ni=0x%x”,i);

                 c=(char)i;

                 printf(“\nc=%c”,c);

}

解答 c=A, i=65, i=0x41, i=66, i=0x42, c=B

文字定数Aを入力するには’A’と書く。また、文字AASCIコードで値65を表す。

 

練習問題2.2 以下の変数に宣言を付け加えてプログラムを完成せよ。ただし、複数の解答が考えられるときはいちばん小さいサイズを選ぶ。

#include <stdio.h>

 

void main(void)

{

    c;  /* 文字型符号付*/

     i;  /* 整数符号付*/

     u;  /* 整数符号なし*/

     l;   /* 長い整数符号付*/

     f;  /* 実数符号付*/

     d;  /*倍精度実数符号付*/

          

                          c = ‘*’;

                     i = 32768

                     u = 65535

                     l = 2147483648

                     f = 01234567

                     d = 123.234567

             

                     printf(“%c,c)

                     printf(“%d,i)

                     printf(“%u,u)

                     printf(“%ld,l)

                     printf(“%f,f)

                     printf(“%lf,d)

}

解答 (ア)char (イ)int (ウ)unsigned (エ)long (オ)float (カ)double

(ウ)の答えはunsigned intでもよい。

 

列挙型(enumeration

ある変数の取り得る範囲を明示的に指定できる型を列挙型という。例えば、

              enum Boolean {Female,Male} sex;

と書くとき、Booleanは、識別子であり、Female,Maleは列挙子リスト(enumerator-list)と呼ばれ、sexはこの列挙型を持った列挙変数の名前となる。

C入門 / 次の章