Lesson 1

全体像をつかむ

Lesson 1 Chapter 1
全体像をつかむ

C言語とは

C言語は、ほかの言語と比べてコンピュータが直接理解できる機械語に近い言語です。そのため、コンピュータに対して細かな指示を出すことが可能で、メモリ(プログラムやデータを一時的に格納する場所)の管理や、ビット毎の論理演算(Lesson6)、ポインタの演算(Lesson7)など、ハードウェアを制御する処理をしやすい特徴を持っています。

機械語とは

機械語(マシン語)とは、コンピュータ(CPU)が理解できる唯一の言語で、すべて「0」と「1」の2進数と呼ばれる数値の羅列で構成されています。C言語で記述されたプログラムは、必ず機械語で記述されたプログラムに変換されてから実行されます。

1-1_1.png

C言語でできること

C言語の活躍の場はとても多く、例えば、OSの開発、携帯電話などの通信分野、家電製品、ロボット制御など、様々な分野で活用されています。また、C言語はプログラミングの基礎となる言語となるため、学習にも最適といえます。

OS(Operating System)とは

オペレーティングシステムの略でMicroSoft社の「Windows」とApple社の「Mac OS」が有名です。OSの詳細を書くと、本Lessonの内容からそれてしまうので詳細は割愛します。

C言語の歴史

C言語は、1972年にベル研究所のデニス・リッチー氏が主体となって開発されました。当初、UNIXというOSの実装を進めるための言語として設計されました。C言語開発に至るまでの道のりは、UNIX開発言語の発展の歴史と並行して進んでいます。
1980年に入ると、C++やJavaをはじめとした、さまざまな言語が登場しましたが、C言語の影響を多く受けています。新しい言語が次々と開発されているにも関わらず、50年が経過した今でもC言語はさまざまな用途で使われ続けています。これは、C言語が低級言語と高級言語の両方を性質を備えていることが大きく影響しているといえます。

低級言語と高級言語

機械語、あるいはアセンブリ言語などの機械語に近いプログラミング言語のことを低級言語(低水準言語)と呼びます。 それに対し、人間にとって分かりやすく記述できるプログラミング言語のことを高級言語(高水準言語)と呼びます。 低級言語の代表格にはアセンブリ言語、高級言語にC言語があります。現在使われているプログラミング言語の多くは、いずれも高級言語です。

C言語の規格

C言語は当初、明確な規格が存在せず、1978年にC言語の設計開発者のデニス・リッチー氏とヴライアン・カーニハン氏が出版した書籍「プログラミング言語C」が実質上C言語の標準とされていましたが、C言語の普及につれて、明確な標準規格が望まれていました。
そこで米国国家規格協会(ANSI)と国際標準化機構(ISO)が共同でC言語の規格化が進められ、1989年12月にANSIによる最初のC言語の標準規格が誕生しました。ANSIにより制定された規格はANSI Cと呼ばれ、現在でも多くの開発現場で使用されています。1990年12月にISOも標準化規格を発行しました。
C言語の規格は、1989年にANSIによって制定された規格(通称「C89」)以降、ISOによって、1999年にC99、2011年にC11と改定されています。
日本では日本工業規格(JIS)がC89規格を翻訳して1993年に規格を制定しました。

ANSIとISO

ANSIは、米国内にける工業分野の標準化組織で、日本のJISに相当します。またISOは、スイスのジュネーブに本部を置く非政府組織で、国際間の取引をスムーズに行うため、工業製品のほか、マネジメントの規格を作成しており、工業製品であればネジやキャッシュカードのサイズ、マネジメントでは業務品質管理についての規格などを策定しています。

開発におけるC言語が適している場面

C言語の特長として注目したいのは、高速に動作するプログラムが書けることです。C言語が誕生した1970年頃のコンピュータは、現在に比べると処理速度がとても遅く、使えるメモリもごくわずかでした。そんな状況で生まれたC言語は、処理が簡潔で高速なプログラムや、メモリの消費量が少ないプログラムが書けるプログラミング言語になっています。プログラマの技量やコンパイラの性能によりますが、C言語で書いたプログラムは、アセンブリ言語で書いたプログラムに近い速度で実行できます。ハードウェアの特性を活かしたプログラムが書けることも、C言語の特長です。C言語はアセンブリ言語と同様に、CPUなどのハードウェアが持つ機能にアクセスして、性能を引き出せます。昔に比べるとコンピュータが速くなった今でも、ハードウェアが備えている高速化のための特別な機能を呼び出すためには、C言語が役立ちます。こうした特長を持つC言語は、例えば次のような用途に向いています。

OS本体やOS上で動作するツールの作成

Unix本体やUnix上で動作するツールの作成に使われてきたC言語は、Unix以外のOSも含めて、今でもOS本体やOS上で動作するツールの作成に活用されています。私たちが普段使っているOSやツールの中には、C言語やC++で記述されているものが多くあります。

データの高速な処理

高速なプログラムが書けるC言語は、色々な形式のデータを素早く処理するプログラムを書くのに向いています。例えば画像や音声といったデータは大容量になる場合が多く、処理に時間がかかる傾向があるので、できるだけ高速なプログラムを書きたいものです。このような大容量のデータを処理するプログラムの作成には、C言語やC++がよく使われます。

AI(人工知能)

AIに関するプログラムは、Pythonなどのプログラミング言語から、既存のライブラリ(色々なプログラムから利用する機能を集めたソフトウェア)を呼び出すことが一般的です。こういったAIのライブラリは、高速な処理を実現するために、C言語やC++などで記述されていることがよくあります。

開発におけるC言語が適さない場面

C言語での開発に適していないのは、Webアプリやスマホアプリの開発です。後発のプログラミング言語の中に、それぞれのアプリケーション開発に適した言語が存在するため、あえてC言語を選択するメリットは少ないといえるでしょう。

Webアプリやスマホアプリの開発に適した言語

Webアプリ…Ruby、PHP、Javaなど
スマホアプリ…Kokolin、Swift、objective-Cなど

Lesson 1 Chapter 2
画面に表示する

Windowsの場合は、統合開発環境(IDE)の1つである「Microsoft Visual Studio Community」(以下、Visual Studio)を利用するとC言語におけるプログラミングを効率的に行うことができます。(今回は2022版のインストール方法と使い方を紹介します)IDEは無料で利用することが可能な製品が多く、入門者にとっては強い味方になります。また、インストールやコンパイル、プログラムの実行が簡単にできるように作られています。

Visual Studioのインストール

以下のサイトにアクセスして早速ダウンロードしましょう。
「無料ダウンロード」をクリックして「VisualStudioSetup.exe」をダウンロードします。

https://visualstudio.microsoft.com/ja/downloads/

1-2.png

ダウンロードした「VisualStudioSetup.exe」を開いて「続行」をクリックします。

1-2_1.png

「C++によるデスクトップ開発」にチェックを入れて「インストール」をクリックします。「必要な領域の合計」は20GB近くありますので、インストール先ドライブに十分な空き容量があるどうか確認しておきましょう。

1-2_2.png

ダウンロード完了までしばらく時間が掛かるので待ちます。

1-2_3.png

インストールが完了したらPCを再起動します。

1-2_4.png

再起動後「Visual Studio Installer」アイコンをクリックして「起動」をクリックします。

1-2_5.png

「サインイン」を求められますが「今はスキップする。」を選択することも可能です。サインインしない場合はVisual Studioを30日間利用することが可能です。Visual Studioを継続して利用するのであれば、サインインすることをおすすめします。Microsoftのアカウントを持っていない場合は、「アカウントの作成」をクリックしましょう。

1-2_6.png

「Visual Studioの開始」をクリックします。

1-2_7.png

「新しいプロジェクト作成」をクリックします。

1-2_8.png

「空のプロジェクト」を選択して「次へ」をクリックします。

1-2_9.png

「新しいプロジェクトを構成します」画面に遷移したら「作成」をクリックします。

1-2_10.png

「ソースファイル」を右クリックして「追加」項目の「新しい項目」をクリックします。

1-2_11.png

「新しい項目の追加」ウインドウが表示されますので「HalloWorld.c」と入力して「追加」をクリックします。

1-2_12.png

簡単なプログラムの作成

「HalloWorld.c」ファイルが作成されますので、下記の画像の通りにコーディングしてみましょう。
1行目は、#include <stdio h>と記述します。#i_ncludeと<stdio.h>の間には[半角スペース]を入力して空白を記述します。
2行目は、int main (void)と記述します。intとmain(void)の間には[半角スペース]を入力して空白を記述します。
コードの記述3行目には{(波括弧)を記述します。波括弧は他の括弧と間違えやすいので注意しましょう。
4行目は、printf("Hallo Worrld!");と記述します。ダブルクオーテーション記号(")や、¥記号、セミコロン記号(;)は間違えやすいので注意しましょう。また、行の先頭では、Tabキーまたはスペースキーを押して間隔(インデント)を空けましょう。
5行目は、何も記述せず改行します。これは何も処理されない行で、コードを見やすくするための記述です。
6行目は、return 0;と記述します。returnと0;の間には[半角スペース]を入力して空白を記述します。また、行の先頭は、Tabキーまたはスペースキーを押して間隔(インデント)を空けま しょう。
7行目は、}と記述して改行します。

halloworld.c
#include <stdio.h>
int main(void) {

    printf("Hallo World!\n"); 
    
    return 0;
}

画面上部メニューの「ビルド」→「ソリューションのビルド」をクリックします。 1-2_14.png


画面下部の「出力」ウィンドウにビルド結果が表示されます。 「ビルド: 成功 1」と表示されていればビルド成功です。もし「失敗 1」と表示された場合はコーディングに誤りがあります。もう一度ソースコードを見直してみましょう。 1-2_15.png


「ビルド: 成功 1」と表示された場合は、画面上部メニューの「デバッグ」→「デバッグなしで開始」をクリックします。

1-2_16.png

コンソール画面への表示

「コマンドプロンプト」ウインドウが表示され、コーディングしたプログラムの実行結果「Hallo Worrld!」が表示されていることが分かります。結果が確認できたら、キーボードのいずれかのキーを押すと画面が終了します。

Project1.exe
Hallo Worrld!

コンパイラの準備

コンパイラであるGCC(GNU Compiler Collection)をインストールします。GCCはUnix系のOS用ですが、WindowsやmacOS用に移植した製品もあり、その中の一つがMinGW(ミンジーダブリュー)です。MinGWはMinimalist GNU for Windows(Windows用の最小限のGNU)を意味しています。本Chapterでは、MinGWから派生したMinGW-W64という製品を使います。まずは下記のサイトにアクセスしてMinGW-W64をダウンロードします。

https://sourceforge.net/projects/MinGW-W64/files/MinGW-W64/

「x86_64-posix-seh」をクリックして「x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z」をダウンロードします。

1-2_20.png

ダウンロードしたMinGW-W64のファイルを展開するために「7-Zip」というツールをインストールします。使用しているパソコンのOSに合わせて32bitまたは64ibtをダウンロードします。

https://sevenzip.osdn.jp/

1-2_21.png

ダウンロードしたファイルを開いて実行します。ユーザアカウント制御のダイアログ「この不明な発行元からのアプリがデバイスに変更を加えることを許可しますか?」と表示された場合は、「はい」をクリックしてください。インストーラが起動したら「install」をクリックしてインストールを開始します。

次に、インストールした7-Zipを使って、Min GW-w64のファイルを展開します。Windowsのスタートメニューで「7-Zip」を検索し、表示された「7-Zip FileManager」をクリックして起動します。7-Zip File Managerで、ダウンロードしたMinGW-W64のファイル「x86 64-8.1 .0-release-posIx-seh-rt_v6-rev0.7z」を見つけて、ダブルクリックします。「mingw64」が表示されたら、「コピー」をクリックします。

1-2_22.png

「コピー」に「c:¥」と入力して「OK」をクリックします。コピーが完了したら、7-Zip File Managerウィンドウを閉じます。

1-2_23.png

MinGW-W64の展開に成功したら動作を確認を行います。スタートメニューで「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択してコマンドプロンプトを起動します。コマンドプロンプトで「setx /m Path "%Path%;c:¥mingw64¥bin"」と入力し、コンパイラのパス(ファイルの場所)を環境変数に設定します。続いて「gcc -v」と入力し、コンパイラのバージョンを表示します。「gcc version 8.1 .0」のように、インストールしたgccのバージョンが表示されたら成功です。

1-2_24.png

プログラムをコンパイルして実行する

gccコマンドを使って行います。リンクも自動的に行われます。保存したソースファイルをgccコマンドに処理させると、実行ファイルが生成されます。‐oオプションを付けると、生成する実行ファイルの名前を指定できます。

実行ファイル名を指定してコンパイル実行

gcc -o <実行ファイル名> <ソースファイル名>

コンパイルを実行した結果、日本語が文字化けしてしまうことがあります。その場合は、オプションに「-fexec-charset=cp932」を追加して日本語を正常に表示できるようにコンパイルします。

Windowsで日本語を含むソースファイルの場合
gcc -o <実行ファイル名> <ソースファイル名> -fexec-charset=cp932

実行ファイル名の指定を省略したい場合には、次のように入力します。この場合の実行ファイル名は、ソースファイル名に関わらず、Windowsでは「a.exe」になります。gcc以外のコンパイラでは、ソースファイル名の拡張子を変更したものを、実行ファイル名にする場合があります。例えばTask.cをコンパイルすると、Task.exeが生成されます。

実行ファイル名を指定しないでコンパイル実行

gcc <ソースファイル名>

プログラムをコンパイルしたときに、再度プロンプトが表示されれば成功です。もしエラーや警告が表示されたら、プログラムを修正して、再度コンパイルしてください。

リンク

ソースファイルをコンパイルすると、「オブジェクトファイル」と呼ばれる機械語のファイルが作成されますが、「オブジェクトファイル」は中間ファイルとも呼ばれ、このままでは、まだプログラムを実行できません。実行可能なプログラムにするためには、作成した「オブジェクトファイル」とコンパイラが提供する関数ライブラリと呼ばれるC言語の部品が格納されたファイルを結合して1つにまとめる、「リンク」と呼ぶ作業が必要となります。この「リンク」を行うプログラムのことを「リンカ」と呼び、リンク作業を行うことではじめて実行可能なプログラムファイルが作成されます。ソースファイルが1つではなく、機能ごとにソースファイルを作成した場合には、コンパイルによって作成された複数のオブジェクトファイルをリンク作業により結合し、「実行可能なプログラムファイル」を作成します。

1-2_28.png

Windowsにおけるコンパイルと実行

使用しているOSがWindowsの場合、デスクトップに「HalloWorld.c」というファイルを新規作成して保存してください。

1-2_25.png

そして「HalloWorld.c」を右クリックして、Visual Studioでファイルを開き、「Hallo World!」の文字を表示するプログラムをコーディングします。 Visual Studioのメニューから「ファイル」を選択して「HalloWorld.cの保存」をクリックします。その後、Visual Studioを閉じます。

1-2_26.png

次の図のようにコンパイルと実行を行います。

1-2_27_1.png

1-2_27_2.png

1-2_27_3.png

操作した内容について説明します。
「cd C:¥Users¥ユーザ名¥Desktop」とenterキーを入力して、デスクトップをカレントディレクトリになるようにcdコマンドを使います。「ユーザ名」の部分には、お使いのパソコンのユーザ名(例ではftとなっている部分)を指定してください。プロンプトが「C:¥Users¥ユーザ名¥Desktop>」に変わったら成功です。
「gcc -o HelloWorld HelloWorld.c」とenterキーを入力して、プログラムをコンパイル(およびリンク)します。エラーや警告が表示されずに、再びプロンプトが表示されたら成功です。
「HelloWorld」とエンターキーを入力して、生成された実行ファイル「HelloWorld.exe」を実行します。コマンドプロンプト上に「Hello World!」と表示されたら成功です。

コンパイラとコンパイル

「コンパイラ」はC言語で書かれたプログラムを解析し、機械語プログラムを生成します。この処理を「コンパイル」と呼びます。

1-1_2.png

自由記述方式とインデント

自由記述方式

C言語の書式は自由記述方式といい、1行や複数行に跨って、単語や文字列、改行、記号といった項目をいくつ書いてもコンパイルが実行可能です。また空白や改行を挿入してもコンパイルできます。しかし、意味を持つ単語(mainやprintf)の途中に改行や空白を入れることはできません。したがって、自由記述方式のルールに従えば、以下のようにコーディングを行うことが可能です。

freeFormat1.c
#include <stdio.h>int main(void){printf("Hallo Worrld!\n");return 0;}
freeFormat2.c

               #include 
<stdio.h> 
int 
             main     
                     (void)
{
            printf("Hallo Worrld!\n")      ; 
return 0  ;  }

上記のようなコーディングは可能ですが、視認性、可読性が悪く、良いコードとは言えないので書かないようにしましょう。
では、良いコードを書くためにはどのような記述が求められるのでしょうか。

                   

インデント

前Chapterで登場した「HalloWorld.c」を確認します。

HalloWorld.c
1 |   #include <stdio.h> 
2 |
3 |   int main(void) {
4 |       printf("Hallo Worrld!\n"); 
5 |       return 0;
6 |   }

4行目の「printf」と5行目「return」の前にある空白は、プログラムを見やすくするための字下げ(行の開始位置をずらす)で「インデント」と呼ばれます。「インデント」はtabキーを使って入力してみてください。4行目の行頭でtabキーを1回押すと、テキストの入力位置を示すカーソルが、右に数文字分まとめて移動します。スペースキーを数回押して「インデント」を入力することもできますが、tabキーを使った方がキーを押す回数が少なくて済むのでtabキーを使うのがおすすめです。

コメント

C言語では、直接プログラムとは関係のないメモをコメントとして記述することができます。実際の現場では、複雑な処理や備忘録としてコメント行を利用することがあります。コメント行は、コンパイル時に除外されるので、適切なコメント行を記述することで、可読性の高い、より良いコーディングが可能です。
例として、「HalloWorld.c」にコメント行を記述してみます。C99以降の規格の開発環境では、コメントとして「//」、半角の「/」(スラッシュ)を2つ分記述すると、それ以降は行末までコンパイルから除外されるのでコメントを記述することができます。C89以前の規格の開発環境では、「//」が使えずエラーになるので注意しましょう。

halloworld.c
// コメント行の例
#include <stdio.h> 

int main(void) {
    
    // "Hallo Worrld!"を出力
    printf("Hallo Worrld!\n"); 
    
    // 処理終了
    return 0;
}

Lesson 1 Chapter 3
文字を扱う

このChapterでは、標準ライブラリのprintf関数やscanf関数を使い、文字の出力や入力方法について学習します。C言語のLessonの最後まで何度も登場する関数なので、書き方や仕組みをしっかり理解しましょう。

printf関数

「Chapter 2」のコードの中で登場したprintfは関数と呼ばれ、「"」から「"」の中に書いた文字を表示することができます。つまりprintfは画面に文字を出力させる機能を持つ関数といえます。

C言語ではこのような命令のことを関数と呼び、C言語が最初から持っている関数を標準ライブラリ関数と呼びます。標準ライブラリ関数には、printf関数以外にも様々なものがありますが、使用頻度の高いprintf関数の構文について理解していきましょう。
printfは書式付標準出力関数と呼ばれ、標準出力(通常は画面)に対して書式を指定して文字などを表示されることができます。printfと記述した後の括弧で囲まれた中の書式化文字列と呼ばれるところに表示したい文字の並びをダブルクォーテーション(")でくくって、そのあとカンマを記述して可変個引数と呼ばれるところに表示したい変数などを記述します。画面に表示したい引数がない場合は、カンマと可変個引数を記述する必要はありません。カンマの後ろで指定する値のことを引数と呼びますが、引数については別のChapterで詳しく解説します。ここでは、引数はprintf関数に与える情報のことだと覚えてください。可変個引数には、任意の引数を複数設定できるため可変となります。

prinf関数の構文

printf("書式化文字列", 可変個引数);

フォーマット指定子

実際にコードを書いてprintf関数の使い方を確認してみましょう。

printf.c
#include <stdio.h>

int main(void) {
    printf("文字%sを表示\n" ,"ABCDEF");                        
    printf("文字%sと%sを表示\n" ,"ABC", "DEF");
}
実行結果
printf.c
文字ABCDEFを表示                
文字ABCとDEFを表示

このプログラムでは、printf関数に引数を指定して画面に表示しています。引数の値を表示する場合は書式化文字列の中に「%s」という「フォーマット指定子」を記述することで、引数で指定した文字列を表示することができます。「%s」は文字列を置き換えたい場合に使用する記号なので、引数も同様にダブルクォーテーション(")でくくり文字列にします。複数の値を置き換えたい場合は、引数をカンマで区切って指定します。

1-3_3.png

改行コード

printfの最後に「¥n」という見慣れない文字列が記述されています。半角のエンマークと小文字のnを組み合わせたコードです。「¥n」は改行コードと呼ばれ、この記号が記述されている位置で改行されます。

改行コード自体は画面に表示されない

プログラムの実行結果に「¥n」は表示されません。
「¥n」をコーディングする際は注意しましょう。

kaigyo.c
#include <stdio.h>
int main(void) {
    printf("あ\nい\nう\nえ\nお\n\nかきくけこ\n");
    return 0;
}

例えば、上記のように改行コードを記述したプログラムの実行結果は以下のようになります。「¥n」を連続してコーディングすると2回改行され、空行を表示することができます。

kaigyo.exe
あ
い
う
え
お
    
かきくけこ

puts関数

上記のプログラムでは、画面に文字と出力するために、puts (プットエス)という関数を使っています。printf (プリントエフ)という機能を使う例が多いのですが、文字列のみを出力する場合にはputsの方がプログラムが簡単に書けて、実行速度も速くなる可能性があります。

returnの省略

プログラムの主要な処理は、main (メイン)に続く{と}の間に書きます。mainの末尾には「return 0;」というreturn (リターン)文を書くことがありますが、下記のプログラムでは省略しています。C99以降では、return文を実行せずにmainの末尾に達した場合、「return 0;」を実行したのと同じ結果になるため、mainの末尾における「return 0;」は省略しても構いません。プログラムが簡潔になるので、mainの末尾における「return 0;」を省略しています。return文については後のChapterで解説します。

halloworld.c
#include <stdio.h>
int main(void) {
    puts("Hallo Worrld!");
}

「HalloWorld.c」のコードをprinf関数からputs関数に変更してreturnを省略しても、プログラムの実行結果は同じになります。

実行結果
halloworld.exe
Hallo Worrld!

void型とは

「void」は、引数や戻り値がないときに使われます。戻り値を持たない関数や、main関数で使用されます。「void型」は、「無い」ことを示す型になります。他の型(int型など)とは異なり、どんなデータであるか定義されていないのです。なので「void型の変数」は存在しません。

scanfで文字を受け取りprintfで表示する

ここでは、標準ライブラリ関数である「キーボードから入力された文字を受け取る関数」を紹介します。C言語ではプログラムを実行するユーザ側の操作を受け付け、入力された文字を画面に表示することができます。

例えば上記のように改行コードを記述したプログラムの実行結果は以下のようになります。

1-3_7.png

例えば上記のように改行コードを記述したプログラムの実行結果は以下のようになります。

1-3_8.png

Lesson 1 Chapter 4
数値を扱う

変数を宣言する際には、変数の型を指定します。整数型(整数を扱う ための型)はintを、浮動小数点数型(浮動小数点数を扱うための型)はdoubleを使います。他にもサイズ(ビット数)が異なる色々な型があります。これらの整数型や浮動小数点数型について紹介します。

int

整数型にはintの他にも、サイズ(ビット数)が異なる次のような型があります。 intはshort以上、longはint以上、long longはlong以上のサイズを持ちます。具体的 なサイズは環境によって変化するので、仕様のサイズ(C言語の仕様で決められて いるサイズ)と、本Lessonで使っているGCCにおけるサイズの両 方を示しました。longに関しては、Windowsでは32ビット(4バイト)、macOS/Iinuxでは64ビット(8バイト)です。

読み方 C言語の仕様サイズ GCCにおけるサイズ
short ショート 16bit以上 16(2byte)
int イント 16bit以上 16(4byte)
long ロング 32bit以上 32(4byte)
long long ロングロング 64bit以上 64bit(8byte)

short、long、long longについては、後にintを付けて、short int、long int、long long intのように書くこともできます。特に理由がなければ、短くshort、long、 long longのように書けばよいでしょう。 sizeof (サイズオブ)という演算子を使うと、型のサイズを知ることができます。 sizeofは指定した型のバイト数を返します。sizeof (size of)は「…のサイズ」という 意味です。
sizeof演算子を使って、整数型のサイズを調べてみましょう。short、int、long,long longのバイト数を出力 するプログラムを書いてください。printf関数の変換指定は%lu (バイト数が多い符号なし整数)を使います。

size1.c
#include <stdio.h>
int main(void) {
  puts("%1u", sizeof(short));
  puts("%1u", sizeof(int));
  puts("%1u", sizeof(1ong));
  puts("%1u". sizeof(1ong long));
  return 0;
}

整数型は次のようなサイズでした。サイズは環境によって異なるので、もし別の環境をお使いならば、プログラムを実行してサイズを確認してください。

sise1.exe
<Windowsでの実行例>

2    ← short      2バイト (16ビット)
4    ← int        4バイト (32ビット)
4    ← 1ong       4バイト (32ビット)
8    ← 1ong long  8バイト (64ビット)

doubleとfloat

浮動小数点数型にはdoubleの他にも、サイズ(ビット数)が異なる浮動小数点数型があります。大部分の環境においては、次のようなサイズの浮動小数点数型に対応しています。

読み方 C言語の仕様サイズ 一般名
float フロート 32bit 単精度
double ダブル 64bit 倍精度
long duble ロングダブル 64bit以上 拡張倍精度

上記の「float」は、floating-point number (フローティング・ポイント・ナンバー、 浮動小数点数)に由来すると思われます。またlong doubleに関しては、環境によっ てサイズが異なります。 整数型と同様にsizeof演算子を使って、浮動小数点数型のサイズを調べてみま しょう。float、double、long doubleのバイト数を出力するプログラムを書いて ください。printf関数の変換指定は%lu (バイト数が多い符号なし整数)を使います。

size2.c
#include <stdio.h>
int main(void) {
  puts("%1u", sizeof(float));
  puts("%1u", sizeof(double));
  puts("%lu". sizeof(1ong double));
  return 0;
}

浮動小数点数型は次のようなサイズでした。サイズは環境によって異なる可能性があるので、もし別の環境をお使いならば、ぜひプログラムを実行してサイズを確かめてみてください。

size2.exe
<Windowsでの実行例>

4     floatのバイト数
8     doubleのバイト数
16    1ong doubleのバイト数

特に問題がなければdoubleを使うdoubleはfloatよりも精度が高いので、使いやすい浮動小数点数型です。通常の用途には、doubleを使って問題ありません。速度やメモリの節約を重視する場合にはfloatを使うfloatはdoubleよりも精度が低いのですが、一般にdoubleよりも計算が高速で、必要なメモリの容量もdOubleの半分です。そのため、大量の浮動小数点数を高速に処理する必要がある3Dグラフィックスなどでは、floatが使われる場合があります。なお、異なる浮動小数点数型の間で計算を行うと、暗黙の変換によって、よりビット数が少ない(サイズが小さい)型が、よりビット数が多い(サイズが大きい)型に変換されます。例えば、floatとdoUbleの計算では、floatがdoubleに変換され、結果もdoubleになります。

四則演算子

1-4_1.png

C言語における計算式は、必ずこの「演算子」と「被演算子」から成ります。 「演算子」には単項演算子や二項演算子などいくつかの種類があり、 使い方や注意点もそれぞれ異なります。初歩的なプログラミングの段階から よく登場する「四則演算子」を中心に紹介します。

加算と減算

整数の計算を行い、計算結果を画面に表示するプログラムを書いてみましょう。

calculation1.c
#include <stdio.h>
int main(void) {
  // 加算
  printf("3 + 15 = %d\n", 3 + 15); 
  // 減算
  printf("11 - 6 = %d\n", 11 - 6); 
  return 0;
}

実行結果

calculation1.exe
3 + 15 = 18
11 - 6 = 5

このプログラムは3 + 15、および11 - 6を計算し、その結果を出力するプ ログラムです。実行結果から4行目の1+2の計算結果が3,5行目の 3-1の計算結果が2となっていることが確認できます。この2つの式の計 算結果はみなさんの予想どおりであったかと思います。算数や数学と|司様 098 402 四目」漉& に、C言語においても「+」は足し算(加算)を表す演算子、「-」は引き算(減 算)を表す演算子だということがわかります。

乗算と除算

次に掛け算(乗算)と削り算(除算)の演算子について説明します。小学 校の算数では、掛け算をするときの記号は「×」、割り算をするときの記号 は「÷」、というように習いました。しかしc言語をはじめとするほとんど のプログラミング言語において、この2つの記号は使いません。 c言語では「×」や「÷」の代わりに、掛け算をするときは「☆」、割り算 をするときには「/」の減算子を使います。プログラムを書いてみましょう。

calculation2.c
#include <stdio.h>
int main(void) {
  // 乗算
  printf("5 × 6 = %d\n", 5 * 6);
  // 除算
  printf("9 ÷ 3 = %d\n", 9 / 3);     
  // 剰余算
  printf("5 ÷ 2 の余りは %d\n", 5 % 2);  
  return 0;
}

実行結果

calculation2.exe
5 × 6 = 30
9 ÷ 3 = 3
5 ÷ 2 の余りは 1

このプログラムでは「2×3」、「6÷2」、「7÷2の余り」の計算をしています。4行目の2*3の計算結果が6,5行日の6/2の計算結果が3となっていることがそれぞれ確認できます。はじめのうちはこの記号の違いに憧れないかもしれませんが、四則演算はこれからプログラムの中でさまざまな計算をしていくうえでの基本ですので、ここでしっかりと覚えておきましう。

また先ほどの例において、掛け算、割り算の後に6行日に「7%2」という、見慣れない計算式が出てきました。記号の意味さえ理解してしまえば、これは難しいものではありません。小学校の算数において、「7÷2は?」という問題の答えとして「3余り1」と習うでしょう。その余りの部分を求める(剰余)演算子が「宅」になります。厳密にいえば「宅」は四則減算ではありませんが、割り算と一緒に覚えましょう。

scanfで数字を受け取り、演算結果をprintfで表示する

前Chapterで扱ったscanf関数を使って演算を行う

整数を入力する

calculation3.c
#include <stdio.h>
int main(void) {
  int x;
  puts("整数を入力してください");
  scanf("%d", &x);
  // 加算
  printf("3 + x = %d\n", 3 + x); 
  // 減算
  printf("11 - x = %d\n", 11 - x); 
  // 乗算
  printf("5 × x = %d\n", 5 * x);
  // 除算
  printf("9 ÷ x = %d\n", 9 / x); 
  // 剰余算
  printf("5 ÷ x の余りは %d\n", 5 % x);  
  return 0;
}

実行結果

calculation3.exe
整数を入力してください。
3
3 + x = 6
11 - x = 8
6 × x = 15
9 ÷ x = 3
5 ÷ x の余りは 2

フォーマット指定子

四則演算を行うコードの中で「%d」というフォーマット指定子が記述されています。これは整数を扱う場合に用いるフォーマット指定子で、演算結果を表示する場合に用いられます。計算を行うプログラムでは、頻繁に登場します。下記のコードは「%d」を使った置き換えや演算の例になります。整数値を書き換えるなど、ほかにどういった計算に使えるか考えながらコーディングしてみましょう。

calculation4.c
#include <stdio.h>
int main(void) {

  // 単純な置き換え
  printf("リンゴ1個は%d円です\n", 200);

  // 四則演算を行う
  printf("12 ÷ 2 - 2 + 3 × 100 = %d\n", 12 / 2 - 2 + 3 * 100); 

  // scanf関数を使った計算
  int y;
  scanf("%d", &y)
  printf("入力した値の2乗は%dです\n", y * y);  
  return 0;
}
実行結果
calculation4.exe
リンゴ1個の値段は200円です。
12 ÷ 2 - 2 + 3 × 100 = 304
5
入力した値の2乗は25です。