C/C++ Notes

C/C++ Notes

Overview

 C言語は、1972年にAT&Tベル研究所で開発された汎用プログラミング言語である。
 高級言語の特徴を持ちながら、ハードウェア寄りの記述も可能な低級言語の特徴も併せ持つ。コンパイラ型言語であるため、実行速度が他の言語と比べ速く、資源制約が厳しい場合(組み込み系)や、実行速度性能が要求されるソフトウェア(OS, バックグラウンドアプリケーション等)の開発に用いられることが多い。

コンパイラ型言語 (高級言語)

 プログラムの実行前コンパイラ(翻訳機)を使い、ソースコードを機械語に変換する言語。一度コンパイルしてしまえば、機械語を実行するだけなので、インタプリタ型言語に比べ、実行速度が速い。

C言語のコンパイル過程
C言語のコンパイル過程


C/C++, Java, Rust, Go, COBOL, FORTRAN, Pascal...

インタプリタ型言語 (高級言語)

 ソースコードを1行ずつ機械語に変換しながら実行する言語。翻訳しながら実行するので、コンパイラ型言語に比べ実行速度が遅いが、不具合箇所を特定しやすい。

Python, JavaScript, Ruby, PHP...

アセンブリ言語 (低級言語)

 機械語の命令を人間に分かりやすいようにアルファベットや数字で表現する言語
アセンブラで機械語に翻訳する。

変数

  • 予約語以外
  • 英数字又は_(アンダーバー)
  • 1文字目は 英字又は_ (数字以外)
  • 31文字以内
という条件を満たしていれば宣言をすることが出来る
※ 英字の大文字と小文字は区別される

予約語

 プログラミング言語において、定められた役割が決まっているため、変数名や関数名等にすることが出来ない単語

C言語の予約語
auto
break
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while

データ型

フォーマット指定子

プリプロセッサ

 ソースコードをコンパイルする前に事前処理をさせる。
 ソースコードの変換や置換を行うことで、開発者の生産性を向上させる。

#include

 外部ファイルの取り込み

ライブラリファイル 含まれている関数 説明 戻り値
<stdio.h>
standard input output

主に入出力を扱うための関数が含まれている
printf(
    "フォーマット文字列", 
    a, 
    b...
);
第1引数("フォーマット文字列")をコマンドプロンプトに表示
フォーマット指定子(%~)により、第2引数以降(a, b...)を表示可能
int
sprintf_s(
    a, 
    sizeof(a), 
    "フォーマット文字列", 
    b, 
    c...
);
asizeof(a)(aの大きさ分)第3引数("フォーマット文字列")を代入
フォーマット指定子(%~)により、第4引数以降(b, c...)を代入可能
int
scanf(
    "フォーマット文字列", 
    &a, 
    &b...
);
第1引数("フォーマット文字列")内の型(フォーマット指定子(%~)により指定可能)通りに入力を受け付け、第2引数以降の変数アドレス(&a, &b...)に文字列を代入(空白で区切られる)
※別の入力関数を一緒に使うとエラーの元になることがある
int
fgets(
    char a, 
    sizeof(a), 
    f
);
asizeof(a)(aの大きさ分)fから読み込む
キーボード入力の場合 : fstdinとする
char *
fopen(
    "ファイルのパス", 
    "モード"
);
"ファイルのパス"のファイルを"モード"に従い開く
読み取り : r
バイナリ読み取り : rb
書き込み : w
バイナリ書き込み : wb
追記 : a
バイナリ追記 : ab
FILE *fp
fclose(FILE *fp);
fopen();で開いたファイルを閉じる
int
<stdlib.h>
standard library

汎用的に役立つ関数が含まれている
system("コマンド");
第一引数"コマンド"(OSのコマンド)を実行
int
atoi("文字列");
"文字列"int型に変換
int
atof("文字列");
"文字列"double型に変換
double
rand();
0からRAND_MAXまでの範囲の疑似乱数整数を生成
int
srand(unsigned int seed);
疑似乱数を生成するための開始点を設定
int
malloc(size_t size);
size[Byte]のメモリを確保(最大 16711568[Byte])
void *
calloc(
    size_t size, 
    size_t type
);
type * size[Byte]のメモリを確保し、0で初期化 (最大 2147483424[Byte])
void *
realloc(
    void *ptr, 
    size_t size
);
先頭アドレス*ptrから、size[Byte]のメモリを確保
void *
free(void *ptr);
指定したアドレス*ptrのメモリを解放
void *
exit(int status);
エラーコード : statusでプログラムを終了
abort();
プログラムを異常終了させる
qsort(
    void *base,
    sizeof(base)/sizeof(type),
    size_t type,
    int (*compare)(
        const void *element1,
        const void *element2
    )
);
*baseが先頭アドレスの配列をクイックソートする
引数 説明
void *base
ソート対象配列の先頭アドレス
size_t type
ソート対象配列の各要素のサイズ
int (*compare)(
    const void *element1, 
    const void *element2
)
比較基準関数 戻り値で大きさを決める
0より小さい → element2より、element1が小さい
0より大きい → element2より、element1が大きい
0element1element2は等しい
bsearch(
    void *key,
    void *base,
    sizeof(base)/sizeof(key),
    sizeof(key),
    int (*compare)(
        const void *element1,
        const void *element2
    )
);
qsort();等で事前にソートした配列から二分探索を行う
引数 説明
void *key
検索キーのアドレス
void *base
探索対象配列の先頭アドレス
int (*compare)(
    const void *element1, 
    const void *element2
)
比較基準関数 戻り値で大きさを決める
0より小さい → element2より、element1が小さい
0より大きい → element2より、element1が大きい
0element1element2は等しい
void *
getenv("環境変数");
"環境変数"に対応する値が入ったアドレスを返す
char *
<string.h>
string

主に文字列操作に関する関数が含まれている
strcmp(
    char *string1, 
    char *string2
);
文字列を比較
0より小さい → string2より、string1が小さい
0より大きい → string2より、string1が大きい
0string1string2は等しい
int
strstr(
    char *string1, 
    char *string2
);
string1string2 が最初に現れる位置を検索
char *
strlen("文字列");
"文字列"の長さを取得
int
<math.h>
mathematics

主に数学的な計算を行うための関数が含まれている
sin(x);
y=sin(x) (正弦)のyを返す
double y
cos(x);
y=cos(x) (余弦)のyを返す
double y
tan(x);
y=tan(x) (正接)のyを返す
double y
asin(x);
y=arcsin(x) (逆正弦)の y[rad]を返す
double y
acos(x);
y=arccos(x) (逆余弦)の y[rad]を返す
double y
atan(x);
y=arctan(x) (逆正接)の y[rad]を返す
double y
atan2(a, b);
y=arctan(a/b) (逆正接)の y[rad]を返す
double y
exp(x);
y=exのyを返す
double y
log(x);
自然対数 y=ln(x) (= loge(x) )のyを返す
double y
log10(x);
常用対数 y=log10(x) のyを返す
double y
sqrt(x);
xの正の平方根を返す
double y
pow(x, y);
z=xyのzを返す
double z
fabs(x);
xの絶対値を返す
double y
ceil(x);
x以上の最小の整数値を返す(天井関数)
double y
floor(x);
x以下の最大の整数値を返す(床関数 ガウス記号)
double y
round(x);
xの小数点以下を四捨五入
double y
<ctype.h>
character type

主に文字の分類や変換を行うための関数が含まれている
islower(int c);
cが 英小文字以外:0 英小文字:非0 を返す
int
isupper(int c);
cが 英大文字以外:0 英大文字:非0 を返す
int
isdigit(int c);
cが 数字以外:0 数字:非0 を返す
int
tolower(int c);
cが大文字なら小文字 大文字以外はそのままにしたものを返す
int
toupper(int c);
cが小文字なら大文字 小文字以外はそのままにしたものを返す
int

#define (マクロ)

 ソースコードを置換する。

エスケープシーケンス

コメント (注釈)

 プログラムの保守(メンテナンス)をする際、コメントがあると効率を上げることが出来ます。

// 改行するまでコメントとする
/* この間をコメントとする */

演算順序

 C言語における演算順序を以下に示す。

演算順序 演算子 説明
1
()
関数呼び出し, 優先
[]
配列添え字
.
構造体メンバ
->
アロー演算子(ポインタから構造体のメンバを呼び出す)
++
インクリメント(後置)
--
デクリメント(後置)
2
++
インクリメント(前置)
--
デクリメント(前置)
sizeof
記憶サイズ[Byte]
&
アドレス
*
ポインタ
+
正符号
-
負符号
!
否定
~
ビット補数
3
(型)
キャスト
4
*
乗算
/
除算
%
剰余
5
+
加算
-
減算
6
<<
ビット左シフト
>>
ビット右シフト
7
<
小なり (左辺が右辺に比べて小さい)
<=
小なりイコール (左辺が右辺に比べて同じか小さい)
>
大なり (左辺が右辺に比べて大きい)
>=
大なりイコール (左辺が右辺に比べて同じか大きい)
8
==
等号
!=
不等号
9
&
ビット毎論理積(AND)
10
^
ビット毎排他的論理和(XOR)
11
|
ビット毎論理和(OR)
12
&&
論理積(AND)
13
||
論理和(OR)
14
条件?a:b
三項演算子
15
=
代入
+=
加算代入
-=
減算代入
... ...
16
,
コンマ(順次)