C言語を学ぶ時の忘備録
#1 C言語とは
なぜC言語を学ぶ必要があるのか
- Fast as FUCK、くそはやい
- 様々な言語(Python,Java,C#,C++,JS)の母
- どこでも使われてる(DB、組み込みシステム、OS)
大切なこと
- C言語はオブジェクト指向ではない
- オブジェクト指向の機能を拡張したものが、C++
導入すべきもの
- IDE Editor (VSCode...)
- GCC Compiler
IDE VSCodeをインストール
brew install --cask visual-studio-code
C言語 Extensions
- https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools
- https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner
{
"recommendations": ["ms-vscode.cpptools", "formulahendry.code-runner"]
}
GCC Compilerをインストール
既に導入されているか確認
g++ --version
コンパイル時のビルド設定
VSCodeを開いて、メニューバーのターミナルから既定のビルドタスクの構成から、gcc
を選択
最初のプログラム
#include <stdio.h>
int main() {
printf("Hello, world!");
return 0;
}
ビルドすると、「Hello, world!」と出力されるコード
#include <stdio.h>
#include
:他の言語のimportに似ており、どの機能をこのプログラムで使うかを指定。
<stdio.h>
:標準入出力の機能を提供するヘッダファイル。入力と出力に関連する便利な関数(例:printf)が含まれてる。
int main() {
return 0;
}
int
:プログラムが終了した際に、整数値を返すことを示してる。
main
:C言語のプログラムは、mainから全て始まる。
return 0;
:プログラムの正常終了を意味する。慣例として、エラーなしに実行された時は0
を返し、エラーがあった時は1
を返します。
気になること
-
return
を記述しない場合はどうなるのか。- 省略はできるけど、予期せぬ動作をする恐れがあるため、書いた方がいい。
-
int
も同様- 省略ができず、型を指定する必要がある。
#2 GCCによるコンパイルと実行
コンパイル
gcc helloworld.c
このコマンドを実行すると、a.out
というファイルが生成される。
gcc helloworld.c -o helloworld
このコマンドで、helloworld
というファイルが生成される。
実行
./helloworld
これで、実行できる
この記事が参考になりそう。-Wallオプションとか便利そうね。
gcc コンパイルオプション備忘録 #C++ - Qiita
#3 コメントとエスケープシーケンス
1行コメントと複数行コメント
#include <stdio.h>
int main() {
/*
ターミナルに「Hello, worldw!」と出力される。
C言語の学習を始めたばかり。これは複数行コメント
*/
printf("Hello, world!"); // 「Hello, world!」と出力される
return 0;
}
エスケープシーケンス
1 2 3
4 5 6
7 8 9
このように数字を出力したい時は、このように書く。
#include <stdio.h>
int main() {
/*
\t -> tab
\n -> new line
*/
printf("1\t2\t3\n4\t5\t6\n7\t8\t9");
return 0;
}
""の中で、""を使いたい時
printf("\"I like Pizza.\" - Abraham Lincoln probably");
\"
で囲むことにより、以下のような結果で出力が可能
"I like Pizza." - Abraham Lincoln probably
#4 変数
宣言と初期化
int x; // 数値型の変数xを宣言
x = 123; // 変数xの値を、123と初期化
int y = 123; // 宣言と初期化を同時に行う
特徴1. 変数を作るには、宣言と初期化の2ステップを踏む必要がある。
特徴2. 変数の型を宣言する必要がある。
基本の型
int age = 21; // integer ( 整数型 )
float gpa = 2.05; // floating point number ( 浮動小数点型 )
char grade = 'C'; // single character ( 文字型 )
char name[] = "Bro"; // array of characters ( 文字型 )
charについて理解
C言語における、「文字と文字列」の違い
''
: 'A'
だと、1文字の'A'
という文字。
""
: "A"
だと、2文字の'A'
と'\0'
(ヌル終端文字)が含まれる文字列となる。
name[]について理解
char name[] = "Bro";
この一文は、こういう挙動をすることができる。
name[0] = 'B'
name[1] = 'r'
name[2] = 'o'
name[3] = '\0' // ヌル終端文字
変数の出力
printf("Hello %s\n", name);
printf("You are %d years old\n", age);
printf("Your average grade is %c\n", grade);
printf("Your gpa is %f\n", gpa);
%s
:文字列(string
)
%d
:整数(decimal
)
%c
:文字(character
)
%f
:浮動小数点数(float
)
#5 型の種類
double型
float c = 3.141592; // 4 bytes (32bitsの精度) 6-7桁 %f
double d = 3.141592653589793; // 8 bytes (64bitsの精度) 15-16桁 %lf
float型の倍の精度を持つ代わりに、倍のメモリを使用する。
出力
float a = 3.141592653589793;
double b = 3.141592653589793;
printf("%f\n", a);
printf("%lf\n", b);
- 小数点以下6桁のみしか出力されない
-
%0.15f
とすると、小数点以下15桁が表示される
精度の違い
#include <stdio.h>
int main() {
float a = 3.141592653589793;
double b = 3.141592653589793;
printf("%0.15f\n", a);
printf("%0.15lf\n", b);
return 0;
}
これの出力結果を見ることで、精度の違いがわかる
3.141592741012573
3.141592653589793
boolean型
#include <stdbool.h>
bool a = true; // 1 byte ( true or false ) %d
boolean型を使うためには、
stdbool.h
というヘッダファイルをインクルードする必要がある。
trueとfalseはそれぞれ 1
と 0
である。
例文
#include <stdio.h>
#include <stdbool.h>
int main() {
bool a = true;
bool b = false;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
↓出力結果
1
0
char型
char a = 100; // 1 byte ( -128 to +127 ) %d or %c
例文
#include <stdio.h>
int main() {
char a = 100;
printf("%d\n", a);
char b = 100;
printf("%c\n", b);
return 0;
}
出力結果
100
d
%d
:char型変数を10進数として表示
%c
:char型変数をASCIIコードで「100」に対応する「d」を表示
char型変数は、整数値として値を保持できることと、
その値を整数としても文字としても表示させることもできるということ。
ASCII Table
初期化せずに使用した場合
char c;
printf("%d", c);
この場合cには、
「メモリ上にたまたま存在していた値で、予測不可能」な「不定値」が入る。
unsigned char型
unsigned char a = 255; // 1 byte ( 0 to +255 ) %d or %c
負の数を扱わないchar型
例文
#include <stdio.h>
int main() {
unsigned char a = 255;
printf("%d\n", a); // decimalとして表示
unsigned char b = 50;
printf("%c\n", b); // ASCIIコードに対応する文字として表示
return 0;
}
出力結果
255
2
unsigned と signed
signed char a = 127;
charの前にも、signedが隠れているが、わざわざ記述する必要はない。