C言語での変数、データ型、算術式の扱い方

C言語にはデータを操作するために使用できる豊富な算術演算子を持っています。 この章では、int、float、double、char、_Boolデータ型、short、long、long longによるデータ型の変更、変数の命名規則、基本的な数学演算子や算術式、型のキャストについて説明します。 この力を真に活用するためには、使用できるさまざまなデータ型や、変数の作成方法と命名方法をよりよく理解する必要があります。 C 言語には、データを操作するために使用できる豊富な種類の数学演算子があります。 この章では、次のことを学びます。

  • int, float, double, char, _Bool データ型
  • short, long, _Bool によるデータ型の変更。 とlong long
  • 変数名のルール
  • 基本的な数学演算子と算術式
  • 型キャスト

データ型と定数を理解する

あなたはすでにCの基本データ型intに触れている。 C言語には他にfloat、double、char、_Boolという4つの基本データ型があります。 float型と宣言された変数は、浮動小数点数(小数点以下を含む値)を格納するために使用することができる。 double型はfloat型と同じですが、精度がおよそ2倍になっています。 charデータ型は、文字’a’、数字’6’、セミコロン(‘;’)などの1文字を格納するために使用されます(これについては後で詳しく説明します)。 最後に、_Boolデータ型は、0または1という値だけを格納するために使用することができます。 このタイプの変数は、オン/オフ、イエス/ノー、または真/偽の状況を示すために使用されます。 これらの一か八かの選択は、バイナリ選択としても知られている。

Cでは、任意の数値、単一の文字、または文字列は、定数として知られています。 例えば、数字58は一定の整数値を表す。 例えば、”Cでプログラミングすると楽しいよ “という文字列は、定数文字列の一例です。 定数値だけで構成される式を定数式と呼びます。 つまり、

128 + 7 - 17

という式は、式の各項が定数値であるため、定数式となる。 iが10なら125、200なら-65となる。

整数型 int

C言語では、整数定数は1桁以上の数字の羅列で構成される。 その前にマイナス記号があれば,その値が負であることを示す。 158, -10, 0はすべて整数定数の有効な例である。 桁と桁の間にスペースを入れてはいけません。また、999以上の値をカンマで表すことはできません。 (つまり、値12000は有効な整数定数ではなく、12000と書かなければなりません。)

Cの2つの特別な書式により、整数定数を10進数(base 10) 以外のベースで表現することが可能です。 整数値の最初の桁が0である場合、整数は8進数表記、すなわち8進数で表されるとみなされます。 この場合、値の残りの桁は有効な8進数でなければならず、したがって0〜7でなければならない。 つまり、C言語の8進数の値50は、10進数の値40に相当するため、050という表記が使われる。 同様に、8進数の定数0177は10進数の値127(1×64+7×8+7)を表す。 printf()文のフォーマット文字列でフォーマット文字%oを使用することにより、整数値を8進数表記で端末に表示することができる。 この場合、先頭のゼロを除いた8進数で表示される。

整数定数の前にゼロと文字x(小文字でも大文字でも)がある場合,その値は16進数(ベース16)で表されるとみなされます。 文字xの直後には16進数値の桁があり,0〜9の数字とa〜f(またはA〜F)の文字で構成されていることがある。 文字はそれぞれ10~15の値を表す。 つまり、16進数値FFEF0DをrgbColorという整数型変数に代入するには、

rgbColor = 0xFFEF0D;

という記述が使えることになる。 フォーマット文字 %x は、先頭の 0x を除いた値を 16 進形式で表示し、16 進の数字には小文字の a-f を使用します。

printf ("Color is %#x\n", rgbColor);

先頭の0xを含む値を表示するには、次のようにフォーマット文字%#xを使用します:%Xまたは%#Xのような大文字のxは、先頭のxとそれに続く16進数の数字を大文字で表示するために使用できます。 この範囲は、特定のタイプのデータを格納するために割り当てられるストレージの量に関係します。 一般に、この量は言語では定義されていません。 一般的には、実行中のコンピュータに依存するため、実装依存または機械依存と呼ばれます。 例えば、整数がコンピュータ上で32ビットを占めるかもしれませんし、64ビットに格納されるかもしれません。 データ型の大きさを前提としたプログラムを書いてはいけません。 しかし、各基本データ型に対して最小限のストレージが確保されることは保証されています。 例えば、整数値は最低でも32ビットのストレージに格納されることが保証されており、これは多くのコンピュータで「ワード」のサイズである。

浮動小数点数型 float

float型と宣言された変数は、小数点以下を含む値を格納するために使用することができる。 浮動小数点数の定数は,小数点の存在によって区別される。 小数点の前の桁や小数点の後の桁を省略することはできますが、両方を省略することは明らかにできません。 3.、125.8、-.0001はすべて浮動小数点数定数の有効な例です。 浮動小数点値を端末に表示するには、printf変換文字%fを使用します。

浮動小数点定数は、科学的記数法で表すこともできます。 1.7e4はこの表記法で表される浮動小数点値で、1.7×104という値を表している。 eの前の値を仮数といい、その後に続く値を指数という。 この指数は、仮数を乗じる10のべき乗を表し、その前にプラスまたはマイナスの符号を付けることができる。 つまり、定数 2.25e-3 では、2.25 が仮数の値、-3 が指数の値です。 この定数は、2.25×10-3、つまり0.00225という値を表しています。 ちなみに、仮数と指数を分けるeは小文字でも大文字でも書けます。

値を科学表記で表示するには、printf()の書式文字列に書式文字%eを指定する必要があります。 printf()フォーマット文字 %g は、浮動小数点値を通常の浮動小数点表記で表示するか、科学的表記で表示するかを printf() に決定させるために使用されます。 この決定は、指数の値に基づいて行われます。

16進浮動定数は、先頭の 0x または 0X、1 つ以上の 10 進数または 16 進数、p または P、そしてオプションで符号付き 2 進数の順で構成されています。 例えば,0x0.3p10は3/16×210=0.5を表す。

拡張精度型 double

double型はfloat型と非常に似ているが,float変数が提供する範囲が十分ではない場合に使用される。 double型と宣言された変数はfloat型の変数のおよそ2倍の有効数字を格納することができる。

特に指示されない限り、Cコンパイラはすべての浮動小数点定数をdouble値として扱います。

12.5f

ダブル値を表示するには、フォーマット文字である%f、%e、%gを使用することができる。 したがって、’a’、’;’、’0’はすべて文字定数の有効な例である。 最初の定数は文字aを表し、2番目はセミコロン、3番目は文字0-数字の0とは異なります。 一重引用符で囲まれた1文字である文字定数と、二重引用符で囲まれた任意の数の文字である文字列を混同しないでください。

文字定数 ‘\n’ -改行文字は、前に挙げた規則に矛盾するように見えますが、有効な文字定数です。 これは、バックスラッシュがCのシステムでは特殊な文字であり、実際には文字としてカウントされないからである。 つまり、Cコンパイラは’˶’˶は2文字で形成されているのに、1文字として扱ってしまうのです。 バックスラッシュ文字で開始される特殊文字は他にもあります。

フォーマット文字%cは、端末にchar変数の値を表示するprintf()呼び出しで使用できる。

ブールデータ型_Bool

_Bool変数は、値0と1だけを格納できる大きさと言語内で定義されており、使用するメモリ量の正確さは特定されていない。 ブール変数は、ブール条件を示す必要があるプログラムで使用される。 例えば、このタイプの変数は、すべてのデータがファイルから読み込まれたかどうかを示すために使用されるかもしれません。

慣習では、0は偽の値を示し、1は真の値を示すのに使われます。

プログラムの中で_Bool変数を扱いやすくするために、標準のヘッダーファイル <stdbool.h> では bool, true, false という値が定義されている。 この例を第5章「意思決定」のプログラム5.10Aに示します。

プログラム3.1では、Cの基本データ型を使用しています。

プログラム3.1 基本データ型の使用

プログラム 3.1 出力

integerVar = 100floatingVar = 331.790009doubleVar = 8.440000e+11doubleVar = 8.44e+11charVar = WboolVar = 0;

プログラム3の最初の文では、以下のように記述しています。1では、変数integerVarを整数型変数と宣言し、初期値100を代入していますが、あたかも次の2つの文が代わりに使われているかのようです。

int integerVar;integerVar = 100;

プログラムの出力の2行目で、floatingVarに代入されている331.79という値が実際には331.790009と表示されていることに注目してください。 実は、実際に表示される値は、使用している特定のコンピュータ・システムに依存します。 この不正確さの原因は、コンピュータ内部で数字が表現される特殊な方法によるものです。 皆さんも、電卓で数字を扱うときに、同じような不正確さに出くわしたことがあるのではないでしょうか。 電卓で1を3で割ると、.33333333となり、最後に3が追加されるかもしれません。 この「3」の列が、電卓の3分の1への近似値です。 理論的には、3は無限にあるはずです。 しかし、電卓が保持できる桁数は限られているため、電卓には固有の精度がある。 同じような精度の低さが、ここでも当てはまる。

浮動小数点型変数の値を表示する場合、3つの異なる形式を選択することができます。 f 文字は標準的な方法で値を表示するために使用されます。 特に指示がない限り、printf() は常に float または double 値を小数点以下 6 桁で丸めたものを表示します。 9225>

%e文字は、floatまたはdouble変数の値を科学的記数法で表示するために使用されます。

%g文字では、printf()は%fと%eを選択し、さらに末尾のゼロを自動的に表示から削除する。

最後の printf() では、変数が宣言されたときに charVar に割り当てた一文字 ‘W’ を表示するために %c 文字が使用されます。 printf()の最初の引数のような)文字列が二重引用符のペアで囲まれるのに対し、文字定数は常に一重引用符のペアで囲まれなければならないことに注意してください。

最後のprintf()は、_Bool変数が整数フォーマット文字%iを使ってその値を表示できることを表しています。

型指定子: long, long long, short, unsigned, signed

指定子 long が int 宣言の前に直接置かれた場合、宣言された整数変数はいくつかのコンピュータシステムで拡張された範囲となる。 long int宣言の例としては、

long int factorial;

これは、変数factorialをlong integer変数と宣言している。 floatやdoublesと同様に、long変数の特定の精度は、特定のコンピュータシステムに依存する。 多くのシステムで、intとlong intは同じ範囲を持ち、どちらも32ビット幅(231 – 1、または2,147,483,647)までの整数値を格納するために使用できます。

long int型の定数は、オプションで整数定数の最後にL(大文字または小文字)を付加して形成されます。 したがって、

long int numberOfPoints = 131071100L;

では、変数 numberOfPoints を初期値 131,071,100 の long int 型と宣言している。

printf() で long int の値を表示するには、i、o、x の整数フォーマット文字の前に修飾語として l 文字が使用される。 つまり,書式文字%liはlong intの値を10進数で,文字%loは8進数で,文字%lxは16進数で表示できる。

また,long long integerデータ型もあり,

long long int maxAllowedStorage;

は,指定した拡張精度(少なくとも64ビット幅であると保証)で,指定した変数を宣言していることになる。 lは1つではなく、printf文字列の中で2つ使用され、”%lli “のように長い長整数を表示します。

long指定子は、次のようにdouble宣言の前にも使用できます:

long double US_deficit_2004;

long double定数は、

1.234e+7L

long doubleを表示するにはL修飾子が使用されて、直後にlまたはLを付けて浮動定数と記述されます。 つまり、%Lfはlong doubleの値を浮動小数点表記で表示し、%Leは同じ値を科学的表記で表示し、%Lgはprintf()に%Lfと%Leのどちらかを選ぶように指示する。

int宣言の前に置かれる指定子shortは、Cコンパイラに対して宣言中の特定の変数はかなり小さな整数値を保存するために使われることを伝える。 プログラムが多くのメモリを必要とし、利用可能なメモリの量が制限されている状況では問題となりうる。

いくつかのマシンでは、short int は通常の int 変数の半分の量のメモリを消費する。

C言語で明示的にshort int型の定数を記述する方法はない。short int型変数を表示するには、通常の整数変換文字である%hi, %ho, %hxの前にhを置く。 また、printf()ルーチンの引数として渡されたときに整数に変換されるため、整数変換文字のいずれかを使ってshort intを表示することもできる。 宣言

unsigned int counter;

はコンパイラに対して、変数カウンタが正の値のみを格納するために使用されることを宣言している。

符号なしint定数は次のように定数の後にu(またはU)を置くことで形成される。

0x00ffU

整数定数を書くときにu(またはU)とl(またはL)を組み合わせることができるので、

20000UL

はコンパイラに定数20000を符号なしロングとして扱うように指示する。

u、U、l、Lのどの文字も続かず、通常のサイズのintに収まらない大きさの整数定数は、コンパイラによってunsigned intとして扱われます。 小さすぎて unsigned int に収まらない場合、コンパイラはそれを long int として扱います。 それでも long int に収まらない場合、コンパイラはそれを unsigned long int として扱います。 9225>

変数を long long int, long int, short int, unsigned int 型と宣言するとき、キーワード int を省略することができる。 したがって、符号なし変数 counter は等価に次のように宣言することができます。

unsigned counter;

char 変数を符号なしと宣言することもできます。

signed 修飾子を使用して、特定の変数が符号付きであることをコンパイラに明示的に伝えることができます。 その使用は主に char 宣言の前で行われ、さらなる議論は第13章「データ型の詳細」まで延期される。

これらの指定子の議論がこの時点であなたにとって少し難解に見えても心配はいらない。 本書の後の章では、これらの異なる型の多くが実際のプログラム例で説明されます。 13章では、データ型と変換についてさらに詳しく説明します。

表3.1に基本的なデータ型と修飾子をまとめます。

表 3.1 基本データ型3044