C言語の基礎・基本
2016.07.01
この記事は最終更新日から1年以上が経過しています。
C言語の基礎・基本をつらつらと。
エスケープシーケンス
エスケープシーケンス | 詳細 |
¥a | 警告音 |
¥b | バックスペース |
¥t | 水平タブ |
¥v | 垂直タブ |
¥n | 改行 |
¥f | 改ページ |
¥r | 復帰 |
¥’ | ‘ |
¥” | “ |
¥¥ | ¥ |
¥? | ? |
¥◯◯◯ | 8進数◯◯◯の文字コードを持つ文字(◯は0〜7の数字) |
¥xhh | 16進数hhの文字コードを持つ文字 (hは0〜9の数字とA〜Fの英字) |
2進数、8進数、16進数
参照表
10進数 | 2進数 | 8進数 | 16進数 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
18 | 10010 | 22 | 12 |
19 | 10011 | 23 | 13 |
20 | 10100 | 24 | 14 |
型
基本型
種類 | 名前 | サイズ例 | 記憶できる値の範囲例 |
文字型 | char | 1バイト | 英数字1文字 -128〜127 |
unsigned char | 1バイト | 英数字1文字(符号なし)0 ~ 255 | |
整数型 | short int | 2バイト | 整数 -32768 ~ 32767 |
unsigned short int | 2バイト | 整数(符号なし)0 ~ 65535 | |
int | 4バイト | 整数 -2147483648 ~ 2147483647 | |
unsigned int | 4バイト | 整数(符号なし)0 ~ 4294967295 | |
long int | 4バイト | 長整数-2147483648 ~ 2147483647 | |
unsigned long int | 4バイト | 長整数(符号なし)0 ~ 4294967295 | |
浮動小数点型 | float | 4バイト | 単精度 浮動小数点数 3.4E-38 ~ 3.4E+38 |
double | 8バイト | 倍精度 浮動小数点数 1.7E-308 ~1.7E+308 | |
long double | 8バイト | 拡張倍精度 浮動小数点数 1.7E-308 ~1.7E+308 |
ビットとバイト
2進数の1桁分は「ビット」となります。
1ビット
0 or 1
2進数の8桁の数値は「バイト」となります
00101110
1バイトでは、
の値を表す事が可能となります。
「2バイトのshort int型の値」は、次の様な2進数16桁となり
0000000000000011
とおりの値を表す事ができます。
short intの例だと、以下の様になる。
2進数 | 10進数 |
0000000000000000 | 0 |
0000000000000001 | 1 |
0000000000000010 | 2 |
… | … |
0111111111111111 | 32767 |
1000000000000000 | -32368 |
1000000000000001 | -32367 |
… | … |
111111111111111 | -1 |
先頭の1ビット分が数値の正負を表している。
unsigned short int型の場合は負の数値がないので以下のとおりとなる。
2進数 | 10進数 |
0000000000000000 | 0 |
0000000000000001 | 1 |
0000000000000010 | 2 |
… | … |
111111111111111 | 65535 |
数値入力
scanf
scanf("変数仕様", &変数)
キーボードから入力例
#include <stdio.h> int main(void) { int num; printf("整数を入力。 ¥n"); scanf("%d", &num); printf("%dが入力された。 ¥n", num); return 0; }
小数
scanf("%lf", &num); printf("%fが入力された。 ¥n", num);
文字を入力
getchar()
入力例:
#include <stdio.h> int main(void) { char ch; printf("文字を入力。(英数字) ¥n"); ch = getchar(); printf("%cが入力された。 ¥n", ch); return 0; }
getchar()は標準入力(standard input)
演算子
・演算子(演算するもの: operator)
・オペランド(演算の対象:operand)
記号 | 名前 | 記号 | 名前 |
+ | 加算 | >= | 以上 |
– | 減算 | < | 未満 |
* | 乗算 | <= | 以下 |
/ | 除算 | == | 等価 |
% | 剰余 | != | 非等価 |
+ | 単項+ | ! | 論理否定 |
– | 単項- | && | 論理積 |
~ | 補数 | || | 論理和 |
& | ビット論理積 | * | 間接参照 |
| | ビット論理和 | , | 順次 |
^ | ビット排他的論理和 | ( ) | 関数呼び出し |
= | 代入 | ( ) | キャスト |
<< | 左シフト | [ ] | 配列添字 |
>> | 右シフト | . | メンバ参照(ドット) |
++ | インクリメント | -> | メンバ間接参照(アロー) |
— | デクリメント | ? : | 条件 |
> | より大きい | sizeof | サイズ |
インクリメント・デクリメント
インクリメント演算子(increment operator)
a++
デクリメント演算子(decrement operator)
b--
前置と後置
前置
++a
#include <stdio.h> int main(void) { int a = 0; int b = 0; b = ++a; printf("代入前にインクリメント。bの値は%dです。 ¥n", b); return 0; }
result
代入前にインクリメント。bの値は1です。
後置
a++
#include <stdio.h> int main(void) { int a = 0; int b = 0; b = a++; printf("代入後にインクリメント。bの値は%dです。 ¥n", b); return 0; }
result
代入後にインクリメント。bの値は0です。
前置と後置で出力内容が異なります。
代入演算子
・代入演算子(assignment operator)
記号 | 詳細 |
+= | 加算代入 |
-= | 減算代入 |
*= | 乗算代入 |
/= | 除算代入 |
%= | 剰余代入 |
&= | 論理積代入 |
^= | 排他的論理和代入 |
!= | 論理和代入 |
<<= | 左シフト代入 |
>>= | 右シフト代入 |
sizeof演算子
・sizeof演算子(sizeof operator)
sizeof演算子を用いると色々な型や式のサイズを知る事ができます。
#include <stdio.h> int main(void) { int a = 0; int b = 0; printf("short int型のサイズは%dバイトです。 ¥n", sizeof(short int)); printf("int型のサイズは%dバイトです。 ¥n", sizeof(int)); printf("long int型のサイズは%dバイトです。 ¥n", sizeof(long int)); printf("float型のサイズは%dバイトです。 ¥n", sizeof(float)); printf("double型のサイズは%dバイトです。 ¥n", sizeof(double)); printf("long double型のサイズは%dバイトです。 ¥n", sizeof(long double)); printf("変数aのサイズは%dバイトです。 ¥n", sizeof(a)); printf("式a+bのサイズは%dバイトです。 ¥n", sizeof(a+b)); return 0; }
result
short int型のサイズは2バイトです。 int型のサイズは4バイトです。 long int型のサイズは4バイトです。 float型のサイズは4バイトです。 double型のサイズは8バイトです。 long double型のサイズは8バイトです。 変数aのサイズは4バイトです。 式a+bのサイズは4バイトです。
シフト演算子
・シフト演算子(shift operator)
シフト演算子は
数値を2進数で表した場合の桁を左または右に指定数だけずらす(シフトする)
という演算です。
左シフト演算子の場合は、
左辺で指定した桁数を左にずらし、右端から0を入れる。
short int型の値の5<<2 という左シフト演算子の例:
5 0000000000000101
<< 2
20 0000000000010100
10進数では20の値となります。
右シフト演算子の場合は、
右辺で指定した桁数を右にずらし、はみ出した桁数だけ左端から0を入れる。
となります。
右シフトを行った場合の例:
5 0000000000000101
>> 2
1 0000000000000001
10進数では1の値となります。
・桁をずらすと言う事は。。
10進数の場合、桁をずらすと
5
50 左へ1ケタずらす(10倍する)
500 左へ2ケタずらす(100倍する)
ということがわかります。
すなわち、1ケタずらす「 10倍する」2ケタずらす「
100倍する」ということになります。
2進数のシフト演算子では
101
1010 左へ1ケタずらす(2倍する)
10100 左へ2ケタずらす(4倍する)
1ケタずらす「2倍する」2ケタずらす「
4倍する」ということがわかります。
演算子の優先順位
左結合
a + b + 1
(a + b) + 1
左から評価される。
右結合
a = b = 1
a = (b = 1)
右から評価される。
記号 | 名前 | 結合規則 |
( ) | 関数呼び出し | 左 |
[ ] | 配列添字 | 左 |
. | メンバ参照(ドット) | 左 |
-> | メンバ間接参照(アロー) | 左 |
++ | 後置インクリメント | 左 |
— | 後置デクリメント | 左 |
! | 論理否定 | 右 |
~ | 補数 | 右 |
+ | 単項+ | 右 |
– | 単項- | 右 |
sizeof | サイズ | 右 |
++ | 前置インクリメント | 右 |
— | 前置デクリメント | 右 |
& | アドレス | 右 |
* | 間接参照 | 右 |
( ) | キャスト | 右 |
% | 剰余 | 左 |
* | 乗算 | 左 |
/ | 除算 | 左 |
+ | 加算 | 左 |
– | 減算 | 左 |
<< | 左シフト | 左 |
>> | 右シフト | 左 |
> | より大きい | 左 |
>= | 以上 | 左 |
< | 未満 | 左 |
<= | 以下 | 左 |
== | 等価 | 左 |
!= | 非等価 | 左 |
& | ビット論理積 | 左 |
^ | ビット排他的論理和 | 左 |
| | ビット論理和 | 左 |
&& | 論理積 | 左 |
|| | 論理和 | 左 |
? : | 条件 | 右 |
= | 代入 | 右 |
, | 順次 | 左 |
型変換
大きいサイズの型の変数に小さいサイズの型の値を代入する。
#include <stdio.h> int main(void) { int inum; double dnum; inum = 120; printf("int %d ¥n", inum); dnum = inum; printf("double %f ¥n",dnum); return 0; }
result
int 120; double 120.000000
小さいサイズに代入すると
#include <stdio.h> int main(void) { int inum; double dnum; dnum = 120.5; printf("double %f ¥n",dnum); inum = dnum; printf("int %d ¥n", inum); return 0; }
result
double 120.500000 int 120
切り捨てが行われてしまいます。
キャスト演算子
・キャスト演算子
(型)式
double dnumをint型に変換
inum = (int)dnum;
dnum = 120.5 は、inum = 120 と切り捨てられるのは上記と同様です。
異なる型の演算
#include <stdio.h> int main(void) { int d = 2; double pi = 3.14; printf("直径が%dセンチの円の ¥n", d); printf("円周は%fセンチです。 ¥n", d*pi); return 0; }
result
直径が2センチの円の
円周は6.280000センチです。
一方のオペレンドを大きいサイズの方に型変換してから演算を行う
int型のdの値の「2」がdouble型の数値(2.0)に変換され演算が行われています。
得られる式の値もdouble型の数値となります。
同じ型同士の演算
同じ型同士で演算を行う場合で意図しない値になる時
#include <stdio.h> int main(void) { int num1, num2; double div; num1 = 5; num2 = 4; div = num1 /num2; printf("5/4は%fです。 ¥n", div); return 0; }
result
5/4は1.000000です。
int型の変数num1とnum2を使い、5÷4の結果をdouble型変数 divに代入しようとしたところ、
「1.25」の値を期待していたのですが、出力は「1.00..」となってしまいました。
この場合は「キャスト演算子」を利用するか、num1かnum2のどちらかをdouble型にする必要があります。
div = (double)num1 /(double)num2;
result
5/4は1.250000です。
関係演算子
演算子 | 式が真となる場合 |
== | 右辺が左辺に等しい |
!= | 右辺が左辺に等しくない |
> | 右辺より左辺が大きい |
>= | 右辺より左辺が大きいか等しい |
< | 右辺より左辺が小さい |
<= | 右辺より左辺が小さいか等しい |