はじめに
当シリーズは、C言語をプログラミング初心者でも理解しやすいように重要な部分をまとめて全体像を把握してもらうことを目的として執筆している。
初学者でも取り組みやすいように工夫はしているが、Pythonなどの他のプログラミング言語に一度取り組んで、考え方や文法などを理解した上で読むことでより理解が深まると思われる。
当方の環境はmacOSであるが、Windowsの場合はWSLを使うなどしてUbuntuの仮想環境を構築し、VS Code Remote Developmentを使うことでC言語の開発環境を構築すると良い。
開発環境: macOS, VS Code
clang version 15.0.0
0. C言語とは?
1972年にAT&Tのベル研究所でデニス・リッチーによって開発されたプログラミング言語。
オペレーティングシステムの開発、特にUnixオペレーティングシステムを効率的に書くことを目的として設計されたプログラミング言語である。
C言語の構文と概念は、後のC++, Java, C#に影響を与えている。
プログラミングの基本を学ぶ上でC言語を学ぶことは、他の多くの高級言語を理解する手助けとなるのだ。
コンパイラ言語
コンパイラ言語は、プログラムのソースコードを一度に全部機械語に翻訳するプログラム(コンパイラ)を使用する。この翻訳過程は「コンパイル」と呼ばれ、完了すると実行可能なバイナリファイルが生成される。このバイナリファイルは、OS上で直接実行することができる。
コンパイラ言語には、C、C++、Rustなどがある。
実行速度が速い: コンパイルされたプログラムは直接ハードウェアで実行されるため、インタープリタ言語に比べて高速
最適化が可能: コードを最適化し、無駄な操作を省略することでパフォーマンスを向上させることができる
安全性: コンパイル時に多くのエラーチェックが行われるので、実行前に問題を特定しやすい
コンパイル時間: 大きなプロジェクトではコンパイルに時間がかかることがある
プラットフォーム依存性: 異なるプラットフォームで実行するには、それぞれのプラットフォームに対して再コンパイルする必要がある
1. Hello, World!
早速C言語の世界を見ていこう。
以下のコードはHello, World!を出力する単純なプログラムである。
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
#include
#include <ファイル名>
#includeはヘッダーファイルを取り込むために使用される。
#include <stdio.h>ではヘッダーファイルstdio.h(標準入出力関連の関数を定義)の読み込みを行っている。今回のプログラムでは、printf関数を使うために必要。
main関数
main関数はプログラム起動時に自動で実行される。C言語では関数の外側に文を書くことができないので、プログラムの本体はmain関数の中に書く。
main関数の戻り値
main関数の戻り値はプログラムの実行が成功したかどうかを示すステータスコード。通常、整数型intで表される。戻り値の型がintなので、main関数はint型で定義されている。
int main() {
// プログラム
return 0; // 正常終了
}
プログラムが正常に終了した場合 → 0
エラーが発生した場合 → 0以外
main関数ではreturnステートメントを省略することができるが、その場合コンパイラによって自動的にreturn 0;が挿入される。
printf()
printfはstdio.hから提供される関数で、フォーマットされたデータをコンソールやターミナルに出力するための関数である。
C言語では、文字列はダブルクォーテーション“”で囲み、改行は\nで指定する必要がある。
2. ユーザーの入力を受け取る
次のプログラムを見てみよう。
#include <stdio.h>
int main() {
int age;
printf("年齢を入力してください: ");
scanf("%d", &age); // ユーザーからの入力を受け取る
// 入力された年齢を表示
printf("あなたは %d 歳です!\n", age);
return 0;
}
ユーザーから年齢を入力してもらい、それをコンソールに出力する単純なプログラムである。
変数
型 変数名;
このプログラムではint型の変数ageを定義している。
変数の宣言と同時に代入を行うこともできる。
int age = 20;
型の種類
C言語で扱える型をいくつか挙げた。
型 | 説明 |
---|---|
char | 1バイトの文字を扱う。通常ASCII文字 |
int | 整数 |
float | 単精度浮動小数点数 |
double | 倍精度浮動小数点数 |
void | 値を持たない型。関数が値を返さないことを示す |
short | 通常のintよりも短い整数 |
long | 通常のintよりも長い整数 |
unsigned int | 負の数を扱わない整数 |
unsignedをつけると負の数が扱われなくなるため、そのぶん扱える範囲が大きくなる。
scanf()
scanf("フォーマット指定子", &変数);
scanf()もstdio.hから提供される関数である。ユーザーからの入力をフォーマットに基づいて読み取り、指定された変数に格納する機能を持っている。
また、scanf
関数は入力を受け取ると、指定されたフォーマット指定子に従ってデータを解析し、指定された変数に左から順に値を格納する。各変数は、対応するフォーマット指定子によって定義された型に基づいてデータを受け取る。
scanf("フォーマット指定子", &変数1, &変数2, ..., &変数N);
例として次のコードを見てみよう。
// main関数の中身だけ一部抜粋したもの
int age;
int height;
printf("年齢と体重を入力してください: ");
scanf("%d %d", &age, &height);
printf("Your age is %d and your height is %d\n", age, height);
出力結果は次のようになる。
年齢と体重を入力してください: 20 60
Your age is 20 and your height is 60
1番目の%dには1番目の変数ageが、2番目の%dには2番目の変数heightが格納されることがわかる。左から順に穴埋めされていく。
フォーマット指定子
入力されるデータの型を指定するためのコードである。フォーマット指定子には次のようなものがある。
%d : 整数(int型)
%f : 浮動小数点数(float型)
%lf : 倍精度浮動小数点数(double型)
%s : 文字列(char型)
今回のプログラム内では、変数ageはint型なので、出力するために%dを用いている。
3. 算術演算子と比較演算子
次に、C言語における算術演算子と比較演算子について見ていく。
まずは次のプログラムを動かして動作を確認してみよう。
#include <stdio.h>
int main()
{
int a = 10, b = 4;
float c = 2.5, d = 4.0;
// 算術演算子
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b);
printf("c / d = %f\n", c / d);
printf("a %% b = %d\n", a % b);
// 比較演算子
printf("a > b = %d\n", a > b);
printf("a < b = %d\n", a < b);
printf("a == b = %d\n", a == b);
printf("a != b = %d\n", a != b);
printf("c >= d = %d\n", c >= d);
printf("c <= d = %d\n", c <= d);
return 0;
}
算術演算子まとめ
演算子 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算(整数では商のみを返す) |
% | 剰余(整数のみの演算) |
比較演算子まとめ
演算子 | 説明 |
---|---|
== | 等しい |
!= | 等しくない |
> | より大きい |
< | より小さい |
>= | より大きいか等しい |
<= | より小さいか等しい |
4. 型変換(キャスト)
あるデータ型の値を別のデータ型に変換することができる。型変換を行う際はキャスト演算子(type)を用いる。
#include <stdio.h>
int main() {
int a = 10;
float b = 3.5;
float result;
result = (float)a + b;
printf("Result: %f\n", result); // 出力: 13.500000
return 0;
}
上記のプログラムではa(int型)をfloat型にキャストしている。キャスト演算子(float)を用いている。