Cプログラマへの道 #1 - 基本中の基本

Last Edited: 7/12/2024

このブログ記事では、C言語の基本的な概念を紹介します。

C Basics

変数

さっそくコーディングに入っていきましょう。C言語で変数に値を代入したいとき、次のように行うことができます:

type variableName; // 宣言
variableName = value // 初期化
 
// 例
int a;
a = 123;
 
char b;
b = 'b';

C言語では、変数に使用する型を宣言し、その変数にどれだけのメモリを割り当てるかを決定する必要があります。宣言と初期化を別々に書く必要はありません。

int c = 1;

変数名はできるだけ説明的なものにしましょう。printfを使用して変数に格納されている値を表示したいとき、データ型に対応するフォーマット指定子を使用します。

// intの場合
printf("C: %d", c);

%記号はプレースホルダーで、dint用のフォーマット指定子です。

データ型

ここで、C言語に存在するデータ型を見てみましょう。

C言語の主要なデータ型
型名使用例フォーマット指定子備考
文字char a = 'A'; または signed char a = 1;%c または %d1バイトの整数を格納できます(-128から127まで)。整数がcharに格納されている時、%cを使用すると、対応するASCII文字が表示されます。
文字の配列char a[] = "Hey";%s配列のサイズを[]内に指定できます。(例:char a[10] = "Hey";)
短整数short int a = 1; または short a = 1;%d2バイトのメモリを使用します(-32,768から32,767まで)。
整数int a = 1; または long int a = 1;%d4バイトのメモリを使用します(-2,147,483,648から2,147,483,647まで)。unsignedの場合、フォーマット指定子は%uになります。
長整数long long int a = 1;%lld8バイトのメモリを使用します(-9京から9京まで)。unsignedの場合、フォーマット指定子は%lluになります。
浮動小数点数float a = 3.14;%f4バイトのメモリを使用します(32ビットの精度、または6〜7桁の精度)。
倍精度浮動小数点数double a = 3.1415926535;%lf8バイトのメモリを使用します(64ビットの精度、または15〜16桁の精度)。floatの2倍のメモリを使用します。
真偽値bool a = true;%d#include <stdbool.h>を使用する必要があります。falseは0に、trueは1に対応します。

上記に加えて、正の数のみを格納するunsigned構文があります。例えば、unsigned charは-128から127までではなく0から255までの値を格納します。 unsignedshortintlonglong long intの前に付けることができ、それぞれ対応するフォーマット指定子があります。 格納できる値よりも大きな数値を格納すると、オーバーフローして格納できる最小の数に戻ります。したがって、 各データ型がどれだけのメモリと値の範囲を格納できるかを把握しておく必要があります。

フォーマット指定子

フォーマット指定子は、数字の表示方法について多くのことを指定できます。

double pi = 3.1415926535;
 
// 小数点を指定 %.2lf
printf("Pi: %.2lf\n", pi); // => Pi: 3.14
 
// フィールド幅を指定 %8.2lf
printf("Pi: %8.2lf\n", pi); // => Pi:     3.14
printf("Pi: %8.3lf\n", pi); // => Pi:    3.141
printf("Pi: %8.4lf\n", pi); // => Pi:   3.1415
 
// 左寄せ %-
printf("Pi: %-8.2lf\n", pi); // => Pi: 3.14
printf("Pi: %-8.3lf\n", pi); // => Pi: 3.141
printf("Pi: %-8.4lf\n", pi); // => Pi: 3.1415

上記の例から分かるように、小数点、フィールド幅、および配置を指定できます。

定数 (const vs #define)

実行中に変更できない値(例えば、π\pi)を使用したい場合、次のように行うことができます:

const float PI = 3.14;

constで初期化した後にPIを上書きしようとすると、エラーが発生します。定数を命名する時には 大文字を使うようにしましょう。実は、同じことを達成するための代替手段として #define があります。

#define PI 3.14

違いは、#define はコンパイル前にコード内のすべての PI3.14 に置き換えるのに対し、const はコンパイル中に変数のように扱われることです。このため、#define は型安全ではなく、意図しない場所で PI3.14 に置き換えられると、予期しない動作を引き起こす可能性があります。そのため、ほとんどの場合、 const を使用することが推奨されます。

算術演算子

C言語では、次の算術演算子が利用できます。

// + 加算
// - 減算
// * 乗算
// / 除算
// % 剰余
// ++ インクリメント
// -- デクリメント
 
int x = 5;
int y = 2;
 
int z = x + y; // z=7
int z = x - y; // z=3
int z = x * y; // z=10
int z = x / y; // z=2
x++; // x=6
y--; // y=1

ここで奇妙なことは、int z = x / y;の場合にzが2になることです。zの型をfloatに変更して、より多くの小数点を表示してみましょう。

float z = x / y // z=2.000000

それでも2なのはなぜでしょうか?これは整数除算が小数を切り捨てるためです。xまたはyのどちらかをfloatに変換する必要があります。

float z = x / (float) y // z=2.500000

また計算を実行して変数の値を更新したい場合、x = x * 2x = x - 1の代わりに、次のようにすることができます。

int x = 5;
x += 2; // x=7
x -= 2; // x=5
x *= 2; // x=10
x /= 2; // x=5
x %= 3; // x=2

数学関数

ここでは、C言語で使用できる便利な定義済みの数学関数をいくつか紹介します。

#include <math.h>
 
// 平方根
double a = sqrt(9); // a=3.0000
// 指数
double b = pow(2, 4); // b=2^4=16
// 四捨五入
int c = round(3.14); // c=3
// 天井
int d = ceil(3.14); // d=4
// 床
int e = floor(3.99); // e=3
// 絶対値
double f = fabs(-10); // f=10
// 対数
double g = log(3); // g=1.1
 
// 三角関数(ラジアン単位)
double h = sin(1); // h=0.84
double i = cos(1); // i=0.54
double j = tan(1); // j=1.56

ユーザー入力

最後に、C言語でユーザー入力を受け取る方法について説明します。次のようにしてユーザー入力を取得できます。

// ユーザー入力を格納する変数を宣言
char name[25];
 
printf("Your Name: ");
scanf("%25s", name); // ユーザー入力
printf("Hello, %s!", name);
 
int age;
 
printf("Your Age: ");
scanf("%d", &age); // ユーザー入力
printf("You are %d years old!", age);

これを実行すると、コードにユーザー入力を組み込むことができます。ただし、名前に「Micheal Jordan」のようにスペースを入れると、 「Hello, Micheal!」とだけ表示されてしまいます。これは、scanfが空白文字までしか読み取らないためです。 ユーザー入力に空白文字を含めるには、代わりにfgetsを使用します。

#include <string.h> // string.hをインクルードする必要があります
 
char name[25];
 
printf("Your Name: ");
fgets(name, 25, stdin); // 空白を含むユーザー入力
name[strlen(name)-1] = '\0';
printf("Hello, %s!", name);

上記のコードを実行すると、「Micheal Jordan」と入力した場合、「Hello, Micheal Jordan!」と表示されます。(詳細については、今は気にしないでください。)

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース