このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

web帳

記事詳細

2016.07.01

C言語の基礎・基本

c-lan

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ビット

[code]0 or 1[/code]

2進数の8桁の数値は「バイト」となります

[code]00101110[/code]

1バイトでは、[latex]$$2^8=256[/latex]

の値を表す事が可能となります。

「2バイトのshort int型の値」は、次の様な2進数16桁となり

[code]0000000000000011[/code]

[latex]$$2^16=65536[/latex]とおりの値を表す事ができます。

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

[code]scanf("変数仕様", &変数)[/code]

 

 

キーボードから入力例

[code]#include <stdio.h>

int main(void)
{
int num;
printf("整数を入力。 ¥n");
scanf("%d", &amp;num);
printf("%dが入力された。 ¥n", num);

return 0;
}[/code]

小数

[code]scanf("%lf", &num);
printf("%fが入力された。 ¥n", num);[/code]

文字を入力

[code]getchar()[/code]

入力例:
[code]#include <stdio.h>

int main(void)
{
char ch;
printf("文字を入力。(英数字) ¥n");
ch = getchar();
printf("%cが入力された。 ¥n", ch);

return 0;
}[/code]

getchar()は標準入力(standard input)

演算子

・演算子(演算するもの: operator)

・オペランド(演算の対象:operand)

記号 名前 記号 名前
+ 加算 >= 以上
- 減算 < 未満
* 乗算 <= 以下
/ 除算 == 等価
% 剰余 != 非等価
+ 単項+ ! 論理否定
- 単項- && 論理積
~ 補数 || 論理和
& ビット論理積 * 間接参照
| ビット論理和 , 順次
^ ビット排他的論理和 ( ) 関数呼び出し
= 代入 ( ) キャスト
<< 左シフト [ ] 配列添字
>> 右シフト . メンバ参照(ドット)
++ インクリメント -> メンバ間接参照(アロー)
-- デクリメント ? : 条件
> より大きい sizeof サイズ

インクリメント・デクリメント

インクリメント演算子(increment operator)

[code]a++[/code]

デクリメント演算子(decrement operator)

[code]b--[/code]

 

前置と後置

前置

[code]++a[/code]

[code]#include <stdio.h>

int main(void)
{
int a = 0;
int b = 0;
b = ++a;
printf("代入前にインクリメント。bの値は%dです。 ¥n", b);

return 0;
}[/code]

result

代入前にインクリメント。bの値は1です。

後置

[code]a++[/code]

[code]#include <stdio.h>

int main(void)
{
int a = 0;
int b = 0;
b = a++;
printf("代入後にインクリメント。bの値は%dです。 ¥n", b);

return 0;
}[/code]

result

[code]代入後にインクリメント。bの値は0です。[/code]

前置と後置で出力内容が異なります。

代入演算子

・代入演算子(assignment operator)

記号 詳細
+= 加算代入
-= 減算代入
*= 乗算代入
/= 除算代入
%= 剰余代入
&= 論理積代入
^= 排他的論理和代入
!= 論理和代入
<<= 左シフト代入
>>= 右シフト代入

 

 

sizeof演算子

・sizeof演算子(sizeof operator)

sizeof演算子を用いると色々な型や式のサイズを知る事ができます。

[code]#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;
}[/code]

result
[code]short int型のサイズは2バイトです。
int型のサイズは4バイトです。
long int型のサイズは4バイトです。
float型のサイズは4バイトです。
double型のサイズは8バイトです。
long double型のサイズは8バイトです。
変数aのサイズは4バイトです。
式a+bのサイズは4バイトです。[/code]

シフト演算子

・シフト演算子(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ケタずらす「 [latex]$$10^1=[/latex] 10倍する」2ケタずらす「[latex]$$10^2=[/latex] 100倍する」ということになります。

 

2進数のシフト演算子では

101

1010    左へ1ケタずらす(2倍する)

10100 左へ2ケタずらす(4倍する)

1ケタずらす「[latex]$$2^1=[/latex]2倍する」2ケタずらす「[latex]$$2^2=[/latex] 4倍する」ということがわかります。

 

演算子の優先順位

 

左結合

a + b + 1

(a + b) + 1

左から評価される。

 

右結合

a = b = 1

a = (b = 1)

右から評価される。

記号 名前 結合規則
( ) 関数呼び出し
[ ] 配列添字
. メンバ参照(ドット)
-> メンバ間接参照(アロー)
++ 後置インクリメント
-- 後置デクリメント
! 論理否定
~ 補数
+ 単項+
-  単項-
sizeof サイズ
++ 前置インクリメント
-- 前置デクリメント
& アドレス
* 間接参照
( ) キャスト
% 剰余
* 乗算
/ 除算
+ 加算
- 減算
<< 左シフト
>> 右シフト
> より大きい
>= 以上
< 未満
<= 以下
== 等価
!= 非等価
& ビット論理積
^ ビット排他的論理和
| ビット論理和
&& 論理積
|| 論理和
? : 条件
= 代入
, 順次

 

型変換

大きいサイズの型の変数に小さいサイズの型の値を代入する。

[code]#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;
}[/code]

result

[code]int 120;
double 120.000000[/code]

小さいサイズに代入すると

[code]#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;
}[/code]

result

[code]double 120.500000
int 120[/code]

切り捨てが行われてしまいます。

キャスト演算子

・キャスト演算子

[code](型)式[/code]

double dnumをint型に変換

[code]inum = (int)dnum;[/code]

dnum = 120.5 は、inum = 120 と切り捨てられるのは上記と同様です。

異なる型の演算

[code]#include <stdio.h>

int main(void)
{
int d = 2;
double pi = 3.14;
printf("直径が%dセンチの円の ¥n", d);
printf("円周は%fセンチです。 ¥n", d*pi);

return 0;
}[/code]

result

直径が2センチの円の

円周は6.280000センチです。

一方のオペレンドを大きいサイズの方に型変換してから演算を行う

int型のdの値の「2」がdouble型の数値(2.0)に変換され演算が行われています。

得られる式の値もdouble型の数値となります。

同じ型同士の演算

同じ型同士で演算を行う場合で意図しない値になる時

[code]#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;
}[/code]

result

[code]5/4は1.000000です。[/code]

int型の変数num1とnum2を使い、5÷4の結果をdouble型変数 divに代入しようとしたところ、

「1.25」の値を期待していたのですが、出力は「1.00..」となってしまいました。

この場合は「キャスト演算子」を利用するか、num1かnum2のどちらかをdouble型にする必要があります。

[code]div = (double)num1 /(double)num2;[/code]

result

[code]5/4は1.250000です。[/code]

関係演算子

演算子 式が真となる場合
== 右辺が左辺に等しい
!= 右辺が左辺に等しくない
> 右辺より左辺が大きい
>= 右辺より左辺が大きいか等しい
< 右辺より左辺が小さい
<= 右辺より左辺が小さいか等しい

 

  • RSSを登録する

  • follow us in feedly

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、港区六本木で活動中。

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。