狠狠撸

狠狠撸Share a Scribd company logo
C言語再入門講座
2022年7月9日 版
C言語再入門講座/ネクストステップ 1
c言語再入門講座 目次
1. c言語とは
2. 変数と定数
3. 式と演算子
4. 配列
5. 文字と文字列
6. 2次元配列
7. 変数とポインタ
8. キャスト変換
9. 構造体
10. 共用体
11. 制御
12. 関数
C言語再入門講座/ネクストステップ 2
1. C言語とは
(1) プログラミング言語について
(2) インタプリタとコンパイラ
(3) C言語の歴史と位置付け
(4) なぜ組み込み現場ではC言語が現役なのか
(5) コンピューター内部での数字の扱いとn進数
(6) 2進数、10進数、16進数の相互変換
(7) 16進数での負の数の表し方
(8) C言語標準ヘッダー
(9) C言語の規格
C言語再入門講座/ネクストステップ 3
(1) プログラミング言語について
1. C言語とは
プログラミング言語は、コンピュータに解釈できるように作られた人工言語です。
コンピュータへの指令を行う為のプログラムを書くのに使われる言語です。
プログラミング言語は、人間がコンピュータに命令を指示するために作られており、コンピュータが曖昧
さなく解析できるように設計されています。
多くの場合構文上の間違いは許されず、人間はプログラミング言語の文法に厳密に従った文を入力しなけ
ればなりません。
初期にはコンピュータが直接解読して動作できる機械語(マシン語)が用いられていましたが、
人の使う自然言語とあまりにもかけ離れていて、プログラムの作成効率が悪いため、人にとってわ分かりや
すくしたアセンブラ言語が用いられるようになりました。
ただアセンブラ言語は基本的にマシン語と1対1に対応させただけなので、より人間に理解しやすい記号や
代数表現を用いて書ける高級言語が開発されました。
C言語再入門講座/ネクストステップ 4
(1) プログラミング言語について
1. C言語とは
プログラム言語の設計はその目的に応じてデータの形式,処理方法,文法などに違いが出てきます。
たとえば,計算機のシステムを作るには、より機械語に近い処理が可能な C言語が使われ、科学技術計算に
は数値の扱いに適したフォートランが使われます。
プログラミングの技法に応じて設計される場合も多く、手続き型言語のほか、論理構造を組み立てるのに
適した PROLOGなどの論理型言語や、関数を組み合わせて新しい関数をつくる LISPなどの関数型言語と
いった非手続き型言語が有ります。
また、C++などのオブジェクト指向プログラミング言語(→オブジェクト指向プログラミング)はプログ
ラムの作成効率を上げるのに役立ちました。
機種依存性がない言語として、 Javaはインターネットに向いていることから世界中に広まりました。
近年、たくさんの新しいプログラミング言語が登場しています。
C言語再入門講座/ネクストステップ 5
(2) インタプリタとコンパイラ
1. C言語とは
どのような言語で書かれたプログラムも、そのままでは実行できません。
マイコンが実行できるマシン語に直して初めて、マイコンで実行できます。
高級言語で書かれたプログラムを一括してマイコンで実行可能なマシン語に変換する処理系をコンパイラ、
ソースコードを1行ずつ解釈しながらマシン語に直して実行する処理系がインタプリタです。
主なコンパイラ系プログラム
C/C++、Fortran、Cobol
主なインタプリタ系プログラム
BASIC、Ruby、Python
C言語再入門講座/ネクストステップ 6
(2) インタプリタとコンパイラ
1. C言語とは
コンパイラの特徴
インタプリタより実行速度が速い
コンパイルの手間がかかる
コンパイルした機械語のプログラムは他の環境(OSやCPUが異なる場合)では実行できない
スピードが要求される組込みプログラムにはインタプリタは向いていません
C言語再入門講座/ネクストステップ 7
(3) c言語の歴史と位置付け
1. C言語とは
C言語の歴史は古く、1972年頃UNIXの開発から生まれました。
C言語の 'C‘ の意味は? と問われても明確に答えることは難しいと思います。
B言語の次に作成されたから「C言語」となり、それ以外 'C‘ 自体には特に意味がありません。
B言語の元とされたものは BCPL、その元となったのは CPL となり、A言語 は存在しません。
また、近年ではC言語に続く D言語 の開発も進んでいるとのことです。
また、C++以外にもC#、PHP、Java、JavaScript、Objective-CなどC言語の影響を受けた言語も多数あ
ります。
C言語再入門講座/ネクストステップ 8
(4) なぜ組み込み現場ではc言語が現役で使われ続けているのか
1. C言語とは
c言語は40年以上の歴史のある古い言語です、この40年間に新しい言語も多数でてきました。
ではなぜ組み込みの現場では今でもc言語が主流なんでしょうか。
その①
コードが軽いので、資源が少ない環境や、
制御などにリアルタイム性が要求される組み込みに最適な言語である。
その②
開発資産や主流のソフトウェアがC言語で出来ている。
C言語再入門講座/ネクストステップ 9
(4) なぜ組み込み現場ではc言語が現役で使われ続けているのか
1. C言語とは
その③
C言語は、アセンブラレベルと同等の処理を簡潔に記述でき、
プログラマが意図したコードだけがコンパイラで生成されるため、
マイコンの細かい制御が可能となります。
この事はマイコンのレジスタを操作したりと組み込みプログラムには不可欠です。
その④
UNIXでの実績。
その⑤
解説書が多数出版されている。
C言語再入門講座/ネクストステップ 10
(5) コンピューター内部での数字の扱いとn進数
1. C言語とは
日常生活では基本10進法ですが、10進方以外では
時間が 秒未満は10進法、秒、分は60進法、時は12進法、または24進法 です。
また最近は余り聞かなくなりましたがダースという単位は12進法です。
コンピューターは0と1からなる 2進法で動いています。
なぜコンピューターは2進数で動いているのでしょうか?
電気信号はオンとオフでそのまま0と1を表すことができますが、これを10進数で実現しようとすると、
例えば 0V→0、1V→1、2V→2 …… 8V→8、9V→9
のように電圧を読み取る(計る)回路や、正しい電圧を発生させる回路が必要となり、
とても複雑になってしまいますし、とても現実的ではありません。
プログラムを書く時は数字を表すのに10進数や16進数を使います、
コンパイラが10進数や16進数を自動で2進数に直してくれます。
C言語再入門講座/ネクストステップ 11
128 64 32 16 8 4 2 1
=
=
=
=
=
=
=
=
2? 2? 2? 2? 2? 2? 2? 2? 桁の重み
1 0 0 1 1 0 1 1 2進数
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
128 0 0 16 8 0 2 1 ← 加算
= 155 10進数
(6) 2進数、10進数、16進数の相互変換
1. C言語とは
2進数 →10進数変換 例 : 2進数 10011011 を 10進数に変換
C言語再入門講座/ネクストステップ 12
(6) 2進数、10進数、16進数の相互変換
1. C言語とは
2進数 →16進数変換 例 : 2進数 10011011 を 16進数に変換
2)155 … 1 余りがある場合は 1 下位
2)77 … 1
2)38 … 0 余りが無い場合は 0
2)19 … 1
2)9 … 1
2)4 … 0
2)2 … 0
2)1 … 1 上位
0
逆さになっている余りを横書きに直すと
10011011
155 (10進数) = 10011011 (2進数)
C言語再入門講座/ネクストステップ 13
1. c言語とは
10進数 →2進数変換 例 : 10進数 155 を 2進数に変換
2)155 … 1 余りがある場合は 1 下位
2)77 … 1
2)38 … 0 余りが無い場合は 0
2)19 … 1
2)9 … 1
2)4 … 0
2)2 … 0
2)1 … 1 上位
0
逆さになっている余りを横書きに直すと
10011011
155 (10進数) = 10011011 (2進数)
128 64 32 16 8 4 2 1
=
=
=
=
=
=
=
=
2? 2? 2? 2? 2? 2? 2? 2? 桁の重み
1 0 0 1 1 0 1 1 2進数
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
8 0 0 1 8 0 2 1 ← 加算
= 9 B 16進数
2進数 →16進数変換 例 : 2進数 10011011 を 16進数に変換
(6) 2進数、10進数、16進数の相互変換
C言語再入門講座/ネクストステップ 14
(6) 2進数、10進数、16進数の相互変換
1. C言語とは
10進数 →2進数変換 例 : 10進数 155 を 2進数に変換
128 64 32 16 8 4 2 1
=
=
=
=
=
=
=
=
2? 2? 2? 2? 2? 2? 2? 2? 桁の重み
1 0 0 1 1 0 1 1 2進数
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
8 0 0 1 8 0 2 1 ← 加算
= 9 B 16進数
C言語再入門講座/ネクストステップ 15
(7) 16進数での負の数の表し方
1. C言語とは
16進数の0xFFFFは符号有りと、符号無しでは10進数に変換したときの値が異なります。
符号なし 0xFFFF → 65535
符号有り 0xFFFF → -1
、
符号有りの場合、最上位ビットが1のときはマイナスの値を、最上位ビットが0のときはプラスの値を表します。
最上位ビット 符号の種類
1 マイナスの値を表す
0 プラスの値を表す
符号ありの場合
C言語再入門講座/ネクストステップ 16
(7) 16進数での負の数の表し方
1. C言語とは
ビット? 型 10進数 16進数 2進数
16ビット
short int
1 0x0001 00000000 00000001
-1 0xFFFF 11111111 11111111
unsigned short int 65535 0xFFFF 11111111 11111111
32ビット
long int
1 0x00000001
00000000 00000000 00000000
00000001
-1 0xFFFFFFFF
11111111 11111111 11111111
11111111
unsigned long int 4294967295 0xFFFFFFFF
11111111 11111111 11111111
11111111
最上位ビット
signed と unsigned
C言語再入門講座/ネクストステップ 17
(7) 16進数での負の数の表し方
1. C言語とは
マイナス表現には2の補数を使用します
2の補数は、その対象の2進数を全ビットを反転させ、+1することで実現します。
2進数では2の補数を求める = マイナスの数ということもいえます。
符号ありの場合
0000 0000 0000 0001 1の2進数
1111 1111 1111 1110 0と1を反転する
1111 1111 1111 1111 1をたす
0xFFFF 16進数
2の補数の求め方 -1の場合
C言語再入門講座/ネクストステップ 18
(8) C言語の標準ヘッダ
1. C言語とは
標準ヘッダは、C言語の標準規格で定められている標準ライブラリの
関数宣言や型の宣言やマクロの定義が行われているヘッダ群のことです。
JIS X3010:2003(ISO/IEC 9899:1999)、通称C99では、
標準ヘッダとして以下の24ファイルを定めています。
include <stdio.h> を良くおまじないと表現している書籍等がありますが、
stdio.h は入出力に関連する型、マクロ、関数を宣言が定義されているヘッダです。
C言語再入門講座/ネクストステップ 19
(8) C言語の標準ヘッダ
1. C言語とは
ヘッダ 名称 内容
assert.h 診断機能 実行時診断を行うassertマクロを定義する。
complex.h 複素数計算 複素数計算をサポートするマクロ、関数を宣言、定義する。C99より追加。
ctype.h 文字操作 文字分類、文字変換に有用な関数を宣言する。
errno.h エラー ライブラリ関数内エラーの報告用マクロを定義する。
fenv.h 浮動小数点環境 浮動小数点環境へのアクセス手段を提供するための型、マクロ、関数を宣言、定義する。C99より追加。
float.h 浮動小数点型の特性 浮動小数点型の大きさや特性を表すマクロを定義する。
inttypes.h 整数型の書式変換 最大幅の整数を操作する関数、及び数値文字列を最大幅の整数に変換する関数を宣言する。C99より追加。
iso646.h 代替つづり 演算子の代替つづりマクロを定義する。C95より追加。
limits.h 整数型の大きさ 整数型の大きさを表すマクロを定義する。
locale.h 文化圏固有操作 文化圏固有のデータ等の操作を行う型、マクロ、関数を宣言、定義する。
math.h 数学 数学的な演算を行う関数、及び関連するマクロを宣言、定義する。
setjmp.h 非局所分岐 関数の枠組みを越えた分岐を制御するための型、マクロ、関数を宣言、定義する。
signal.h シグナル操作 種々のシグナルを操作するための型、マクロ、関数を宣言、定義する。
stdarg.h 可変個数の実引数 可変個の実引数を実現するための型、マクロを定義する。
stdbool.h 論理型及び論理値 論理型及び論理値に関連するマクロを定義する。C99より追加。
stddef.h 共通の定義 処理系に依存する型、マクロを定義する。
stdint.h 整数型 指定幅を持つ整数型を宣言する。また、それらの宣言に対応するマクロを定義する。C99より追加。
stdio.h 入出力 入出力に関連する型、マクロ、関数を宣言、定義する。
stdlib.h 一般ユーティリティ 一般ユーティリティに関連する型、マクロ、関数を宣言、定義する。
string.h 文字列操作 文字列の操作を行うための型、マクロ、関数を宣言、定義する。
tgmath.h 型総称数学関数 数学関数の型総称マクロを定義する。
time.h 日付及び時間 時間を扱うための型、マクロ、関数を宣言、定義する。
wchar.h 多バイト文字及びワイド文字拡張ユーティリティ 多バイト文字、ワイド文字に関連する型、マクロ、関数を宣言、定義する。C95より追加。
wctype.h ワイド文字種分類及びワイド文字大文字小文字変換ユーティリティ ワイド文字種の分類や大文字小文字変換に有用な型、マクロ、関数を宣言、定義する。C95より追加。
C言語再入門講座/ネクストステップ 20
(9) C言語の規格
1. C言語とは
K&R
1978年に出版されたリッチーとカーニハンの共著である、
「The C Programming Language」に記載されている。
内容がC言語の仕様として一般に用いられていました。
C89が制定されるまではこの K&R のCがC言語の基準となっていました。
C89(ANSI-C)
1990年に制定
この規規格は、様々な国際規格を制定しているISOと、
米国規格協会、ANSIによってまとめられました。
この企画が、「ANSI-C」と呼ばれる規格で、それ以前のものを、
「K&R」と呼び、同じC言語でも、明確に区別をしています。
日本でもこの企画がJISの規格として採用されました。
なお、多くのCの処理系がいまだに「C89」を基準にしています。
C言語再入門講座/ネクストステップ 21
(9) C言語の規格
1. C言語とは
C99
1999年に制定
行コメント「//」が、正式にC言語のコメントとして使用されるようになりました。
そのほかに、C99言語には、以下のような特徴があります。
?予約語追加
?ヘッダーファイル追加
?プリプロセッサの拡張
?字句追加
?配列の拡張
?整数型の拡張
?複素数型の導入
?文法の拡張
?ライブラリの拡張
このほか 変数の型として bool型 が追加されました。
まだ一部のCの処理系でこの規格が完全に実装されていないといったこともあり、
C99の仕様はまだ本格的には使われていないのが現状です。
※ C99による変更点はこちらのページを参考にしてください。
C言語再入門講座/ネクストステップ 22
(9) C言語の規格
1. C言語とは
C11
2011年に制定
大きな特徴の一つに「脆弱性への対応」があります。
この「脆弱性」の一番の対応はC言語の大きな欠点であった
「バッファオーバーフロー」のに対してです。
また、C11ではgets関数の削除や、printf関数における「%n」書式の廃止、
fopen関数への排他モードの追加など、さまざまな脆弱性対応が導入されています。
そのため、「C11」は我々が一般に「C言語」と言っている言語とはずいぶんと形が変わっています。
C99でもsnprintf() 関数の導入など、バッファオーバーフローへの対策は入っていましたが、
本格的な対策を行ったのはC11からといえます。
C言語再入門講座/ネクストステップ 23
(9) C言語の規格
1. C言語とは
C17(C18)
2018年にに制定
仕様の欠陥修正がメインのマイナーアップデート。
C言語再入門講座/ネクストステップ 24
(9) C言語の規格
1. C言語とは
主なCコンパイラの規格対応
処理系 C規格 備考
GCC 4.5 C99
GCC 4.9 C11
Clang C11、C++17
VC++ C99 ライブラリをほぼ実装、言語機能など規格自体はサポート無し
Intel C++ Compiler C11 バージョン18.0でC11にほぼ対応
armcc C90、C99 ARM コンパイラ
IAR C/C++ C99 IARシステムズが提供する組込みアプリケーション向けC/C++言語IDE(統合開発環境)
CS+ C99 Renesas Electronicsのマイコンチップ用の開発環境
ATmel Studio C99 AVRマイコン用の開発環境
C言語再入門講座/ネクストステップ 25

More Related Content

颁言语再入门讲座冲第1章.辫诲蹿