Open11

C言語を学ぶ時の忘備録

naokinaoki

https://youtu.be/nrbBmoINqtk?si=AUYD8GOsHTHx5pPA

#1 C言語とは

なぜC言語を学ぶ必要があるのか

  • Fast as FUCK、くそはやい
  • 様々な言語(Python,Java,C#,C++,JS)の母
  • どこでも使われてる(DB、組み込みシステム、OS)

大切なこと

  • C言語はオブジェクト指向ではない
  • オブジェクト指向の機能を拡張したものが、C++
naokinaoki

導入すべきもの

  • IDE Editor (VSCode...)
  • GCC Compiler

IDE VSCodeをインストール

brew install --cask visual-studio-code

C言語 Extensions

.vscode/extensions.json
{
  "recommendations": ["ms-vscode.cpptools", "formulahendry.code-runner"]
}

GCC Compilerをインストール

既に導入されているか確認

g++ --version

コンパイル時のビルド設定

VSCodeを開いて、メニューバーのターミナルから既定のビルドタスクの構成から、gccを選択

naokinaoki

最初のプログラム

helloworld.c
#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も同様
    • 省略ができず、型を指定する必要がある。
naokinaoki

https://youtu.be/ME1CNzcHOCY?si=-x_bWZAgoZLuySZ0

#2 GCCによるコンパイルと実行

コンパイル

gcc helloworld.c

このコマンドを実行すると、a.outというファイルが生成される。

gcc helloworld.c -o helloworld

このコマンドで、helloworldというファイルが生成される。

実行

./helloworld

これで、実行できる

この記事が参考になりそう。-Wallオプションとか便利そうね。
gcc コンパイルオプション備忘録 #C++ - Qiita

naokinaoki

https://youtu.be/8Vt9k0bh_Q8?si=ymjOnlvx2qAJ7cMa

#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

このように数字を出力したい時は、このように書く。

escape_sequences.c
#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
naokinaoki

https://youtu.be/aIQk1O08zpg?si=osAbOVGI8WWcDg6R

#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

naokinaoki

https://youtu.be/1eyf1-RU_eg?si=Wv7_5ucKAnAKYa5a

#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
naokinaoki

boolean型

#include <stdbool.h>

bool a = true; // 1 byte ( true or false ) %d

boolean型を使うためには、
stdbool.hというヘッダファイルをインクルードする必要がある。
trueとfalseはそれぞれ 10 である。

例文

#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
naokinaoki

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には、
「メモリ上にたまたま存在していた値で、予測不可能」な「不定値」が入る。

naokinaoki

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が隠れているが、わざわざ記述する必要はない。