はじめに
初心者向けに必要最低限のCの文法や変数などをまとめているだけなのであくまで最低限度で載せていることにご了承くださいませ。
※筆者もC言語は未熟であり、Java、PHPユーザーなのでかなり詳しいわけでもなく素人です。
モジュール読み込み
// 標準入力出力ヘッダーの読込
#include <stdio.h>
stdioはおそらくstandard (標準) input/output (入力出力) のことだと思います。
hはヘッダーファイルの拡張子です。
stdio.hには標準入力出力関係の関数が入っています。
例えば、printfやscanfがあります。
コメント
変数名や関数名を見ても瞬時にわからないものはコメントを付けると過去に書いたコードをわざわざ解析しなくても理解できるようになる。
最初のうちはわかりにくいところが「何をしているか」を大まかにメモしておこう。
チーム開発なら尚更役に立ちますよ~
// これはコメントです。処理には影響しませんよ~
/*
「//」とは違って複数行使えるぜー
使い分けよう!
*/
main関数
// CLIで最初に呼ばれるmain関数
int main(void) {
[以下略...]
// 0 を返して正常終了、それ以外ならば異常終了
return 0;
}
変数と型、文字列 (variable, type, string)
int a; // 整数(int)の変数 a を作る
a = 2; // a に 2 を入れる
// 変数 b を作って 5 を入れる
int b = 5;
// _/ _/ _/ _/ _/ _/ _/ _/
// 一気に宣言できるよ ^^
int a = 11, b = 22, c = 33;
// _/ _/ _/ _/ _/ _/ _/ _/
// ボイド型, 型なし (Void型)
void v; // NG: 変数として作ることはできない
// 整数型 (Int型, Integer型)
int n = 5;
// 倍精度浮動小数点数/倍精度実数型 (Double型)
double d = 2.5;
// 単精度浮動小数点数/単精度実数型 (Float型)
float f = 3.3;
// 文字型 (Char型, Character型)
char c = 'a'; // "a"はダメ
// 文字列 (Char型(文字型)の配列)
char str[7] = "abcdef"; // 文字数 + 1 (ヌル文字\0分) 必要
// → 終端ということを表すための文字
標準入力出力 (stdio)
標準入出の関数やフォーマット指定子を記載していますが、一部のみですのでご了承ください。
標準出力
// 整数型の変数 a を作って10を入れる
int a = 10;
// a に入っている数値を 10進数(decimal としてコンソールに出力
printf("%d", a);
出力フォーマット指定子
指定子 | 型 | 意味 |
---|---|---|
%d | int | 10進数(decimal) として出力 |
%f | float, double | 浮動小数点型(float) として出力 |
%c | char | 文字(character) として出力 ※1文字のみ |
%s | char * | 文字列(string) として出力 |
%o | int | 8進数(octal)として出力 |
%x | int | 16進数(hex/hexadecimal)として出力 |
標準入力
// 整数型の変数 a を作る
int a;
// コンソールから 10進数(decimal)の入力を受け取って変数に代入
scanf("%d", &a); // a には & を付けること (文字列の場合は不要)
// NG: scanf("%d", a);
そのまま渡してもコピーされるだけなので & を付けて変数のアドレス(住所)を与えてあげないとscanf側で代入できない (実質配列である文字列を除く)
入力フォーマット指定子
指定子 | 型 | 意味 |
---|---|---|
%d | int | 10進数(decimal) として入力 |
%f | float | 単精度実数型として入力 |
%lf | double | 倍精度実数型として入力 (long float の略だが、現バージョンのCでは存在せず、doubleが引き継いでいる名残) |
%c | c | 文字(character) として入力 ※1文字のみ |
%s | char * | 文字列(string) として入力 ※配列のため、アドレスではなく、そのまま渡す |
%o | int | 8進数(octal)として入力 |
%x | int | 16進数(hex/hexadecimal)として入力 |
※出力フォーマット指定子とほとんど同じですが、doubleは%lf、floatは%f ということに気を付けてください。
指定子の応用
// フィールド幅指定
printf("%8d", 5); // → 出力: " 5"
// ゼロ埋め なんでや!阪(ry
printf("%08d", 334); // → 出力: "00000334"
// 精度指定 円周率
printf("%.2f", 3.14159); // → 出力: "3.14"
// フィールド幅+精度指定 ふたないやつや
printf("%5.3f", 2.71828); // → 出力: " 2.718"
// ゼロ埋め+精度指定 アボガドロ定数
printf("%05.3f", 6.02214); // → 出力: "06.022"
// 左寄せ
printf("%-6d", 2); // 出力: "2 "
配列 (Array)
// 2つの数値が入るint型の配列を作る
int nums[2];
nums[0] = 4; // 0番目に4を
nums[1] = 2; // 1番目に2を入れる
// _/ _/ _/ _/ _/ _/ _/ _/
// 「5つの数値が入る配列」が3つ入る配列を作る
int nums2[3][5] = {
{1, 5, 3, 3, 6}, // ← nums2[0]
{4, 2, 2, 0, 3}, // ← nums2[1]
{9, 2, 6, 7, 8} // ← nums2[2]
};
キャスト (cast)
キャストとは簡単に言えば型の変換です。
// 暗黙的キャスト (Implicit Casting)
int i = 10;
double d = i; // intからdoubleに
printf("%f", d); // 出力: "10.000000"
// _/ _/ _/ _/ _/ _/ _/ _/
// 明示的キャスト (Explicit Casting)
double d = 13.257;
int i = (int)d; // doubleからintにキャスト
printf("%d", i); // 出力: "13"
明示的キャストを使うと意図的な処理がされるのでオススメというかやった方がいいです。
オブジェクト指向のC++、Java、C#とかならばこれはよく使うので今後C言語以外使うときがあるならもっと使うかもしれませんね。
演算 (calc)
// 加算1
int ans1 = 1 + 1;
printf("%d\n", ans1); // 出力: "2"
// 加算2 (インクリメント)
ans1 += 2;
printf("%d\n", ans1); // 出力: "4"
// 加算3
ans1++; // ans1 += 1 と同じ、便利だお
printf("%d\n", ans1); // 出力: "5"
// 減算1
int ans2 = 5 - 1;
printf("%d\n", ans2); // 出力: "4"
// 減算2 (デクリメント)
ans2 -= 2;
printf("%d\n", ans2); // 出力: "2"
// 減算3
ans2--; // ans2 -= 1 と同じ
printf("%d\n", ans2); // 出力: "1"
// 乗算1
int ans3 = 1 * 2; // 1 x 2
printf("%d\n", ans3); // 出力: "2"
// 乗算2
ans3 *= 3; // 2 x 3 = 6
printf("%d\n", ans3); // 出力: "6"
// 除算1
int ans4 = 6 / 2; // 6 ÷ 2
printf("%d\n", ans4); // 出力: "3"
// 除算2 // 3 ÷ 3
ans4 /= 3;
printf("%d\n", ans4); // 出力: "1"
// 剰余算 (あまり)
int mod = 10 % 3; // 10 mod 3 = 1
printf("%d\n", mod); // 出力: "1"
int a = 5, b = 2;
a++; // ← この時点で a = 6
int c = a * b + b; // → 6 x 2 + 2
printf("%d\n", c); // 出力: "14"
除算の注意として、double型に変換してあげないといけない場合があります!!!!!!!!!T^T
それは次のような時です
10 ÷ 4 をしてdouble型の変数に突っ込みたいとするでしょう。
しかし、double型にキャスト(変換)してあげないとCでは勝手に切り捨てられるのです。なので以下のように割られる側の数をキャストしてあげましょう。
int a = 10;
int b = 4;
double d = (double)a / b; // a を double 型にキャスト
printf("%.3f", d); // 出力: "2.500"
条件文 (if)
int i;
// i に 何らかの整数を入力
scanf("%d", &i);
// i が 2 のとき
if (i == 2)
printf("2が入力されたぞ\n");
// i が 10 より 大きいとき
if (i > 10) {
printf("入力された数値は10より大きい数だよ\n");
}
// i が 5 以上のとき
if (i >= 5) {
printf("入力された数字は5以上だね\n");
}
// i が -1 ではないとき
if (i != -1) {
printf("-1じゃない数値が入力されたよ\n");
}
// i が 2 で割り切れるとき (i が 偶数、2の倍数であるとき)
if (i % 2 == 0) {
printf("偶数が入力されたよ\n");
}
// i が 3 で割り切れるかつ i が 4 で割り切れるとき
if (i % 3 == 0 && i % 4 == 0) {
printf("i は 3の倍数かつ4の倍数だよ\n");
}
// i が 5 で割り切れるまたは i が 8 で割り切れるとき
if (i % 5 == 0 || i % 8 == 0) {
printf("i は 5の倍数または8の倍数だよ\n");
}
switch文
int n = 1;
switch(n) {
case 1:
printf("case 1");
break;
case 2:
printf("case 2");
break;
default:
printf("default");
}
繰り返し (loop)
// for (初期化; 条件式; 演算処理) { 繰り返す処理 }
for (int i = 0; i < 10; i++) {
[以下略...]
// i が 5 のとき、break ループから抜ける
if (i == 5)
break;
// i が偶数(2の倍数)のとき、continue 次のループへ
if (i % 2 == 0) {
continue;
}
}
// while (条件式) { 繰り返す処理 }
int i = 0;
while (i < 10) {
printf("%d\n", i); // 0 から 9 までの数字を出力
i++;
}
条件式から外れる(falseになる)とループから抜け出します。(breakで強制抜け出しもできる)
※do-while文もあるけどそんなに使わないのでここでは記載しません
定数
消費税のような固定する数値などは変数ではなく定数を使うといいでしょう。
もし、変更があった場合は定数の数値を変更するだけで済むという便利さがあります。
#include <stdio.h> // 標準入出の利用
// #define 定義名 値
#define TAX 1.10
// main関数 (最初に呼び出される関数)
int main() {
int price;
scanf("%d", &price);
printf("税込価格: %f", price * TAX);
return 0; // 0で正常終了
}
定数にはもう1つ、constがあったり、またdefineはマクロ定義にも使えますが、次回にします。
最後に
最低限、記述してみました。もし時間があれば#2もつくってみます。
つくるならばポインターやら関数の作成やらのチートシートを作りたいと思ってます。