C言語入門
第2週
プログラミング言語Ⅰ(実習を含む。),
計算機言語Ⅰ・計算機言語演習Ⅰ,
先週の復習1
explorer.exe
• ファイルの操作を行うソフト
• デスクトップもエクスプローラーの一部
ここに「explorer」と入力し ENTERキーを叩いても explorer が表示できます これが「explorer」 デスクトップも「explorer」 コントロールパネルも 「explorer」ポップアップ(popup)メニューの表示
• 表示させたい場所でマウス右クリック
• 例えばデスクトップの何もない場所で
• メニューの右にある三角印
• サブメニューが出る
ポップアップメニュー サブメニューファイルの作成とオープン
• explorer の
• 作成したい場所で
マウス右クリック
• ポップアップメニュー出る
• 新規作成→テキストドキュメント
• 出来たファイルは
適当に名前を付けても良い
• マウス左ダブルクリック
→メモ帳で開かれる
フォルダの作成
• 作成したい所で右クリック
• ポップアップメニューで
• →新規作成
• →フォルダ
• 「新しいフォルダ」ができた
フォルダを開く
• フォルダアイコンの上で左ダブルクリック
• explorer が開く
ファイルの移動
• 「テキストドキュメント」を
• 「新しいフォルダ」の中に移動
• 「ドラッグ&ドロップ」すれば良い
ファイルのコピー
• Ctrl を押したまま 「ドラッグ&ドロップ」
ファイルの選択
• ファイルを単純にクリック
• ファイル左側のチェックボックスをクリック
• ファイルを囲むようにドラッグ(複数選択)
ファイルの削除
• 選択したファイル上で右クリック
• →削除
• ファイルを選択して「Delete」キーでも良い
CUI作業環境 (terminal)
• フォルダをSHIFT+右クリック
cmd.exe
cmd と bash の主なコマンド
cmd bash マニュアル help [コマンド名] man [コマンド名] ファイル一覧 dir ls ファイルの表示 type ファイル名 cat [ファイル名] ディレクトリ移動 cd ディレクトリ名 cd [ディレクトリ名] ディレクトリ表示 cd pwd ファイルコピー copy コピー元 コピー先 cp コピー元 コピー先 ファイル移動 move コピー元 コピー先 mv コピー元 コピー先 ファイル削除 del ファイル名 rm ファイル名↑
tab |← →|↓
ファイル名の補完 コマンド履歴の再利用ファイルの場所の記述方法(パス)
• 以下の図のフォルダ構成を仮定する
作業フォルダは CLangI2014 教科書 pp.30-31.
作業フォルダ
• current directory と言うこともある
ここに表示されているのが 作業フォルダ
Windows の絶対パス、相対パス
• フォルダの階層を ¥ で区切る
• 現在の作業フォルダは以下の場所
• C:¥Users¥kou¥Desktop¥CLangI2014
• 絶対パスはルートデバイスを基準に
• C:¥Users¥kou¥Desktop¥CLangI2014¥week1¥hello.c
• C:¥Users¥kou¥Desktop¥CLangII2014¥week1¥hellogui.c
• 相対パスは現在の作業フォルダを基準に
• week1¥hello.c
• ..¥CLangII2014¥week1¥hellogui.c
教科書 pp.30-31.Cygwin の絶対パス、相対パス
• ディレクトリの階層を / で区切る
• 現在の作業ディレクトリは以下の場所
• /cygdrive/c/Users/kou/Desktop/CLangI2014
• 絶対パスはルートディレクトリ / を基準に
• /cygdrive/c/Users/kou/Desktop/CLangI2014/week1/hello.c
• /cygdrive/c/Users/kou/Desktop/CLangII2014/week1/hellogui.c
• 相対パスは現在の作業ディレクトリを基準に
• week1/hello.c
• ../CLangII2014/week1/hellogui.c
特別なフォルダ名
• 「..」
• 1つ親のディレクトリを意味する
• 「.」
• 現在のディレクトリを意味する
• UNIX では実行ファイルの検索パスに作業ディレ
クトリが含まれない
• 作業ディレクトリ内にある実行ファイルを実行する
際 ./ を実行ファイル名の前に付ける必要がある
補足
• フォルダとディレクトリは同じ概念
• Windows 流ではフォルダと呼ぶ
• UNIX 流ではディレクトリと呼ぶ
• /cygdrive は cygwin 特有の仮想ディレクトリ
• Windows のドライブが配置されている
• 通常 UNIX ではパスに : (コロン)を使わないため
• ネットワークドライブもアクセス出来る
• UNC 表記を用いる
• ¥¥fs.cc.yamaguchi-u.ac.jp¥YUアカウント名
• //fs.cc.yamaguchi-u.ac.jp/YUアカウント名
コマンドの検索パス
• 環境変数 PATH に設定されたパスからコマン
ドを探して実行する
• cmd での確認方法
• 複数のパスは ; (セミコロン)で区切って与える
• bash での確認方法
• 複数のパスは : (コロン)で区切って与える
> echo %PATH%
$ echo $PATH
Windows 8 以降
• explorer.exe から
「表示」→「ファイル名拡張子」→ON
ファイル名末尾に .○○○と表示される
ファイル拡張子の表示
Windows 7 以前
• explorer.exe から
• 「Alt」→「ツール」→「オプション」→「表示」
→「登録されている拡張子は表示しない」→OFF
Alt叩くとメニュー出る ファイル名末尾に .○○○と出る 教科書 p.27.ファイル拡張子とは?
• ファイルの種類を表している
• アプリケーションとの関連付けに用いられる
• 実行ファイルは .exe や .com
• テキスト文書は .txt
• Word2007以降は .docx それより前は .doc
• Excel2007以降は .xlsx それより前は .xls
• PowerPoint2007以降は .pptx それより前は .ppt
• 圧縮ファイルは .zip .lzh .tgz .cab 等々
• 等々
• 変更すると開けなくなる
• 普通は変更する必要はない
• メール等で添付されて来たファイルには注意
• 文書ファイルに見えて実行ファイル(実はウィルス)ということもC コンパイラによるコンパイル
• cmd.exe から bcc32 で行った例
C:¥Users¥kou¥Desktop¥CLangI2014>dir /Bhello.c
C:¥Users¥kou¥Desktop¥CLangI2014>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland hello.c:
警告 W8070 hello.c 6: 関数は値を返すべき(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland C:¥Users¥kou¥Desktop¥CLangI2014>dir /B hello.c hello.exe hello.obj hello.tds C:¥Users¥kou¥Desktop¥CLangI2014>hello hello, world ファイル一覧の表示 コンパイル ファイル一覧の表示 作成した実行ファイルを実行 教科書 pp.36-42.
C コンパイラは何をしているのか?
• デバッグ情報付きコンパイルし逆アセンブル
• .rdata セクション部分
$ gcc -g hello.c $ objdump -d -S -s a.exe a.exe: ファイル形式 pei-x86-64 ... セクション .rdata の内容:100403000 63796767 636a2d31 342e646c 6c005f4a cyggcj-14.dll._J 100403010 765f5265 67697374 6572436c 61737365 v_RegisterClasse 100403020 73000000 00000000 00000000 00000000 s... 100403030 68656c6c 6f2c2077 6f726c64 00000000 hello, world.... 100403040 4743433a 2028474e 55292034 2e382e31 GCC: (GNU) 4.8.1 ... セクション .text の逆アセンブル: ... 00000001004010d0 <main>: #include <stdio.h> main() { 埋め込まれた文字データ 文字データの配置アドレス 文字データの16進表現
C コンパイラは何をしているのか?
• .text セクション部分
セクション .text の逆アセンブル: ... 00000001004010d0 <main>: #include <stdio.h> main() { 1004010d0: 55 push %rbp 1004010d1: 48 89 e5 mov %rsp,%rbp 1004010d4: 48 83 ec 20 sub $0x20,%rsp 1004010d8: e8 73 00 00 00 callq 100401150 <__main> printf("hello, world¥n");1004010dd: 48 8d 0d 4c 1f 00 00 lea 0x1f4c(%rip),%rcx # 100403030 <.rdata> 1004010e4: e8 77 00 00 00 callq 100401160 <puts>
} 1004010e9: 48 83 c4 20 add $0x20,%rsp 1004010ed: 5d pop %rbp 1004010ee: c3 retq 1004010ef: 90 nop ... アセンブラコードを アセンブルして得られた マシン語のバイトコード C言語を コンパイルして得られた アセンブラコード 配置アドレス
テキスト編集系ソフトの種類
• テキストエディタ (メモ帳, 秀丸, etc,,,)
• 基本的にプレーンな文字情報のみ、装飾なし
• リッチテキストエディタ (ワードパッド, etc,,,)
• 字体、色、サイズ等の装飾が可能に
• ワードプロセッサ (Word, 一太郎, etc,,,)
• 更に高度な、文書作成支援機能
• DTPツール (InDesign, Publisher, etc,,,)
プログラミング向け
テキストエディタの機能
• 構文解析機能
• シンタックスハイライト機能
• 行番号表示機能
• 入力補完機能
• マクロ機能
• 正規表現対応の検索機能
• タグジャンプ機能
• 等々
テキストエディタ
• 窓の杜
• オフィス / 文書作成 / テキストエディター
• http://www.forest.impress.co.jp/library/nav/genre/offc/document_txteditor.html• 学習・プログラミング / プログラミング / プログラム向けエディター
• http://www.forest.impress.co.jp/library/nav/genre/stdy/program_progeditor.html• Vector
• Windows / 文書作成 / テキストエディタ
• http://www.vector.co.jp/vpack/filearea/win/writing/edit/テキストエディタ
• サクラエディタ
•
http://sakura-editor.sourceforge.net/
• xyzzy
統合開発環境
• Microsoft Visual Studio
•
http://www.visualstudio.com/ja-jp/
• Eclipse
• Pleiades - Eclipse プラグイン日本語化プラグイン
•
http://mergedoc.sourceforge.jp/
• NetBeans
•
https://ja.netbeans.org/
コメント
• プログラムとしては解釈されない
• 後で読む人用に注釈をしておく機能
• /* ~ */ の間がコメント
• // から行末までがコメント
教科書 p.46. #include <stdio.h> main() { /* ここがコメント */ printf("hello, world¥n"); // ここもコメント } 緑の部分がコメントとして 扱われているSI接頭辞
名前
記号
乗数
キロ(kilo)
K
1000
1=10
3メガ(mega)
M
1000
2=10
6ギガ(giga)
G
1000
3=10
9テラ(tera)
T
1000
4=10
12ペタ(peta)
P
1000
5=10
15エクサ(exa)
E
1000
6=10
18ゼタ(zetta)
Z
1000
7=10
21ヨタ(yotta)
Y
1000
8=10
242進接頭辞(IEC/IEEE)
名前
記号
乗数
キビ(kibi)
Ki
1024
1=2
10メビ(mebi)
Mi
1024
2=2
20ギビ(gibi)
Gi
1024
3=2
30テビ(tebi)
Ti
1024
4=2
40ペビ(pebi)
Pi
1024
5=2
50エクスビ(exbi)
Ei
1024
6=2
60ゼビ(zebi)
Zi
1024
7=2
70ヨビ(yobi)
Yi
1024
8=2
80bit と byte
• b – bit
• 2進数 1 桁
• 通信速度や IC の容量表記等
• 例:
• 100Mbps (100 Mega bits per seconds)
• B – Byte
• 8bit (半角英数1文字分に相当)
• 記憶メディアの容量表記等
• 例:
• 32GB (32 Giga Bytes)
0 1 1bitの記憶素子には 2進数の1桁つまり 0 または 1 のみ 記憶できる 0 0 0 1 1 0 1 1 1bit毎では 単位が小さ過ぎて使い辛い 通常は 8桁を1まとめにして扱う 1bit 8bit = 1byte 8bit = 1byte は 28 = 256 通りの整数を表現可能 符号なし: 0~255 符号あり: −128~12716進数
2進数 10進数 16進数 2進数 10進数 16進数 0b0000 0 0x0 0b1000 8 0x8 0b0001 1 0x1 0b1001 9 0x9 0b0010 2 0x2 0b1010 10 0xa 0b0011 3 0x3 0b1011 11 0xb 0b0100 4 0x4 0b1100 12 0xc 0b0101 5 0x5 0b1101 13 0xd 0b0110 6 0x6 0b1110 14 0xe 0b0111 7 0x7 0b1111 15 0xf 2進数 4桁 → 16進数 1桁 2進数 8桁 → 16進数 2桁 2進数16桁 → 16進数 4桁 2進数32桁 → 16進数 8桁 2進数64桁 → 16進数16桁 2進数 4桁 → 16進数 1桁 に対応 2進数から変換するとキリが良い バイト単位のデータを表す際、読み易い 例: 0b0001001000110100 = 4660 = 0x1234 教科書 pp.50-55.8 bit 整数の N 進数の表現
2進数 符号なし10進数 符号あり10進数 16進数 0b00000000 0 0 0x00 0b00000001 1 1 0x01 0b00000010 2 2 0x02 0b00000011 3 3 0x03 : : : : 0b01111111 127 127 0x7f 0b10000000 128 -128 0x80 : : : : 0b11111100 252 -4 0xfc 0b11111101 253 -3 0xfd 0b11111110 254 -2 0xfe 0b11111111 255 -1 0xff 符号あり整数の場合は最上位ビットを符号ビットとして扱う(2の補数表現) 符号ありは ここで 正負が 入れ替わる16 bit 整数の N 進数の表現
2進数 符号なし10進数 符号あり10進数 16進数 0b0000000000000000 0 0 0x0000 0b0000000000000001 1 1 0x0001 0b0000000000000010 2 2 0x0002 0b0000000000000011 3 3 0x0003 : : : : 0b0111111111111111 32767 32767 0x7fff 0b1000000000000000 32768 -32768 0x8000 : : : : 0b1111111111111100 65532 -4 0xfffc 0b1111111111111101 65533 -3 0xfffd 0b1111111111111110 65534 -2 0xfffe 0b1111111111111111 65535 -1 0xffff 符号あり整数の場合は最上位ビットを符号ビットとして扱う(2の補数表現) 符号ありは ここで 正負が 入れ替わる 教科書 pp.50-55.N bit 整数の最大値・最小値
Bit数 符号あり10進数最小値 符号あり10進数最大値 符号なし10進数最大値 8 -128 127 255 16 -32768 32767 65535 32 -2147483648 2147483647 4294967295 64 -9223372036854775808 9223372036854775807 18446744073709551615 𝑁 −2𝑁−1 2𝑁−1 − 1 2𝑁 − 1符号なし8bit整数の演算
• 整数オーバーフロー
11111111 = 255
+)00000001 = 1
1
00000000 = 0
• 整数アンダーフロー
1
00000000 = 0
-)00000001 = 1
11111111 = 255
有効桁の外に1が溢れた 有効桁外の外から1が溢れた符号あり8bit整数の演算
• 整数オーバーフロー
01111111 = 127
+)00000001 = 1
10000000 = -128
• 整数アンダーフロー
10000000 = -128
-)00000001 = 1
01111111 = 127
• 2の補数表現
1
00000000 = 0
-)00000001 = 1
11111111 = -1
11111111 = -1
+)00000001 = 1
1
00000000 = 0
有効桁の外から1を借りてくる 有効桁の外に1を捨てる 符号ビットに1が溢れた 符号ビットから1が溢れたRAM (Random Access Memory)
メモリの構成
• 1byte単位でアドレスが振られている
• つまり各アドレスには1byteの値を格納出来る
0x00 0x00000000 0x00 0x00000001 0x00 0x00000002 0x00 0x00000003 0x00 0xffffffff : : : : 0x00 0x0000000000000000 0x00 0x0000000000000001 0x00 0x0000000000000002 0x00 0x0000000000000003 0x00 0xffffffffffffffff : : : : 32bitのOSは32bitのアドレス空間 最大232Bytes=4GiB 64bitのOSは64bitのアドレス空間 最大264Bytes=16EiB アドレス 格納値 アドレス 格納値大きい値の扱い方
• 複数のアドレスをまとめて変数に割り当てる
0x00 0x~00 0x00 0x~01 0x00 0x~02 0x00 0x~03 : : : : 0x00 0x~04 0x00 0x~05 0x00 0x~06 : : : : 0x00 0x~07 0x00 0x~08 8bit 0x~00 0x00 0x00 0x~01 0x00 0x~02 0x00 0x~03 : : : : 0x00 0x~04 0x00 0x~05 0x00 0x~06 : : : : 0x00 0x~07 0x00 0x~08 16bit大きい値の扱い方
• 複数のアドレスをまとめて変数に割り当てる
0x00 0x~00 0x00 0x~01 0x00 0x~02 0x00 0x~03 : : : : 0x00 0x~04 0x00 0x~05 0x00 0x~06 : : : : 0x00 0x~07 0x00 0x~08 32bit 0x00 0x~00 0x00 0x~01 0x00 0x~02 0x00 0x~03 : : : : 0x00 0x~04 0x00 0x~05 0x00 0x~06 : : : : 0x00 0x~07 0x00 0x~08 64bit変数の宣言、値の代入
• 値を格納する箱のようなもの
int a; // (1) 変数の宣言
a = 10; // (2) 値の代入
// (3)
教科書 pp.59-61. 10 a 10 (1) (2) a ? a ? (3) int 型の変数を作り a という名前を付ける 中身は未定 変数 a に 10 を代入する 変数 a に 10 が 代入された状態に なっている変数の宣言と初期化
• 宣言
a 10int a = 10; // (1) 変数の宣言と初期化
(1) int 型の変数を作り a という名前を付け 10 を代入する変数
• 文法
データ型 変数名; // 変数の宣言
データ型 変数名=初期代入値;// 変数の宣言と初期化
データ型 変数名1, 変数名2; // 複数の変数の宣言
データ型 変数名1=初期代入値1, 変数名2=初期代入値2;
// 複数の変数の宣言と初期化
変数名 = 値; // 値の代入
教科書 pp.59-61.リテラル
• ソースコードに直接記述された値
• 数値、文字列等
//...
int main(int argc, char *argv[]) {
if (argc < 4) {
printf("Usage: %s output_file micro_sec MIDI_note_No¥n¥n", argv[0]); return EXIT_FAILURE;
}
FILE *fp;
if (fp = fopen(argv[1], "wb")) {
fwrite_wav(44100, atoi(argv[2]), atoi(argv[3]), fp); fclose(fp); } return EXIT_SUCCESS; } wavtest.c 赤字で示したような部分が リテラルに当たる
整数のデータ型
• char, unsigned char
• 1バイト、局所的な文字セット内に1文字を保持し得る
• short, unsigned short
• 少なくとも16ビット
• int, unsigned int
• 少なくとも16ビット
• 通常ホスト計算機の自然な整数サイズ
• 現在は 32 or 64 ビットであることが多い
• long, unsigned long
• 少なくとも32ビット
• 明確にビット数は定められていない
• 割り当てビット数の大小関係は short <= int <=long
• 型の前に unsigned を付けると整数型になる
教科書 pp.53-55.
コンパイルする環境により 使える値の最大値・最小値が 異なる!
整定数のリテラル
• 何も指定しないと int 型
• 末尾に接尾子(U, L)を付けると型指定される
int i =
1234
; // int 型
long l =
1234L
; // long 型
unsigned int ui =
1234U
; // unsigned int 型
unsigned long ul =
1234UL
; // unsigned long 型
C言語のN進数リテラル
• 0b~ 2進数リテラル(C++14の仕様*1)
• 0~
8進数リテラル
• 0x~ 16進数リテラル
• *1: 少なくとも gcc4.3, Clang3.2 では実装済み
• 古いコンパイラでは2進数リテラルは使えない
int dec =
100
; // 10進数の100
int bin =
0b100
; // 2進数の100=10進数の 4
int oct =
0100
; // 8進数の100=10進数の 64
int hex =
0x100
; // 16進数の100=10進数の256
教科書 p.54.浮動小数点数のデータ型
• float
単精度浮動小数点数
• double
倍精度浮動小数点数
浮動小数点数とは
• IEEE754
•
http://ja.wikipedia.org/wiki/IEEE_754
• 以下のようなに表現する方法
±仮数部 × 2指数部
ビット数 符号 指数部 仮数部単精度 32bit 1bit 8bit 23bit 倍精度 64bit 1bit 11bit 53bit 四倍精度 128bit 1bit 15bit 112bit
指数部の値で
小数点の位置が移動するので 浮動小数点と呼ばれる
浮動小数点数定数のリテラル
• 何も指定しないと double 型
• 末尾に接尾子(F, L)を付けると型指定される
• 1.234E5 のような書き方も出来る(指数表現)
• これは1.234 × 10
5
を意味する
float f =
1234F
; // float 型
double d =
1234
; // double 型
long double ld =
1234L
; // long double 型
ASCII文字コード表
0 1 2 3 4 5 6 7 8 9 A B C D E F 0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC → ← ↑ ↓
2 SP ! " # $ % & ' ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ ¥ ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ DEL 8 9 A B C D E F 上 位 4 ビ ッ ト 下位4ビット 赤字は制御コード 教科書 p.51. http://ja.wikipedia.org/wiki/ASCII
HEX Abbr ctrl eseq Name Hex Abbr ctrl eseq Name
0x00 NUL ^@ ¥0 Null 0x10 DLE ^P Data Link Escape 0x01 SOH ^A Start of Heading 0x11 DC1 ^Q Device Control 1 0x02 STX ^B Start of Text 0x12 DC2 ^R Device Control 2 0x03 ETX ^C End of Text 0x13 DC3 ^S Device Control 3 0x04 EOT ^D End of Transmission 0x14 DC4 ^T Device Control 4
0x05 ENQ ^E Enquiry 0x15 NAK ^U Negative Acknowledgement 0x06 ACK ^F Acknowledgement 0x16 SYN ^V Synchronous idle
0x07 BEL ^G ¥a Bell 0x17 ETB ^W End of Transmission Block 0x08 BS ^H ¥b Back Space 0x18 CAN ^X Cancel
0x09 HT ^I ¥t Horizontal Tab 0x19 EM ^Y End of Medium 0x0a LF ^J ¥n Line Feed 0x1a SUB ^Z Substitute 0x0b VT ^K ¥v Vertical Tab 0x1b ESC ^[ ¥e Escape
0x0c FF ^L ¥f Form Feed 0x1c FS ^¥ File Separator 0x0d CR ^M ¥r Carriage Return 0x1d GS ^] Group Separator 0x0e SO ^N Shift Out 0x1e RS ^^ Record Separator 0x0f SI ^O Shift In 0x1f US ^_ Unit Separator 0x20 SP Space 0x7f DEL ^? Delete
文字定数のリテラル
• 1文字を単一の引用符(')で囲む
• char型の値になる
単一の引用符(')は ↑Shift ' 7 +char a =
'a'
; //「a」の文字コード0x61
char lf =
'¥012'
; //改行の文字コード0x0aを8進数で
char vt =
'¥x0b'
; //垂直タブの文字コード0x0bを16進数で
char cr =
'¥r'
; //復帰の文字コード0x0dを
//エスケープシーケ1ンスで
エスケープシーケンス
¥a 警告(ベル)文字
¥b バックスペース
¥f 改頁(フォームフィード)
¥n 改行
¥r 復帰
¥t 水平タブ
¥v 垂直タブ
¥¥ バックスラッシュ
¥? 疑問符
¥' 単一引用符
¥" 二重引用符
¥ooo 8進数 ooo (*1)
¥xhh 16進数 hh (*2)
(*1) ooo は1桁ないし 3桁の8進数を取る (*2) hh は1桁あるいは 2桁の16進数を取る これらの表記は、 1文字(=1バイト)の値を表す。幅広文字定数のリテラル
• char型では表せない拡張文字セット用
• 文字定数の前に L を付ける
• wchar_t型の値になる
wchar_t hira_a = L
'あ'
; // 「あ」の文字コードU+3043?
備考
Wikipedia / JIS_X_0213非漢字一覧#1面4区