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

Archives Details

C言語の基礎・基本

C

2016.07.01

この記事は最終更新日から1年以上が経過しています。

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

0 or 1

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

00101110

1バイトでは、$$2^8=256

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

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

0000000000000011

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

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", &amp;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^1= 10倍する」2ケタずらす「$$10^2= 100倍する」ということになります。

 

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

101

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

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

1ケタずらす「$$2^1=2倍する」2ケタずらす「$$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です。

関係演算子

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

 

Comment

Related Article

M1 Macで、OpenGL GLUTを使ってコンパイルする

2024.04.27

Mac(gcc)で、C言語関数 getch関数を使う。

2020.12.05

Mac Home brewでSDL2.0を簡単に環境設定

2020.06.24

C言語 配列

2016.07.04

C言語 繰り返し文

2016.07.03

C言語 if文・switch文・論理演算子

2016.07.02

C言語の基礎・基本

2016.07.01

Macでの C・C++言語 のエディタ・IDE選び

2016.07.01

CATEGORY LIST

LATEST NEWS

Rustで創る MOS 6502 CPU その3 (Cursorと共に)

Rust

2025.02.24

あけましておめでとうございます(24日経過)

イベント

2025.01.24

アーキテクチャConference 2024に参加してきました。

イベント

2024.11.28

Mac minicomでシリアル通信を行う

電子工作

2024.11.21

Mac 容量足りない問題は、外付けSSDで快適に解決!おすすめ外付けSSD

mac

2024.10.16

Z80エミュレータ- EMUZ80の組み立て

電子工作

2024.10.13

Mac VSCodeで、SFML C++開発環境を作る。

C++

2024.09.09

Rust-SDL2 examplesをすべて試す

Rust

2024.09.01

JavaScriptで、DOMを放り投げる処理

JavaScript

2024.07.27

Rustで創る MOS 6502 CPU その2

Rust

2024.07.23

Rustで創る MOS 6502 CPU その1

Rust

2024.07.19

汎用 3D mesh/model viewerを求め。と、簡単に、FBXファイルをglTF(glb)に変換ツールを求め。

C++

2024.06.06

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

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

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

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

FOLLOW US