Download presentation
Presentation is loading. Please wait.
1
プログラミング演習I 2003年4月30日(第3回) 木村巌
2
知識編:C言語の初等文法 型と定数 変数を使う
3
実践編:コンパイルとは何か? プリプロセッサ コンパイラ アセンブラ リンカ 実際に各過程を見てみよう
4
実践編:それぞれの要素を用いた プログラミング
変数を使ったプログラミング
5
定数 整定数 浮動小数点定数 文字定数 文字列定数
6
整定数 10進定数……(1, 2, 3, …) 8進定数……(01, 02, 03, ……)
16進定数……(0x1, 0x2,……0x9, 0xa,…0xf) 整数接尾辞 U……符号なし(unsigned) L……ロング(long) LL……ロングロング (long long), C99のみ 表現できる数の範囲については、後述.
7
整定数(つづき) 8進表記を10進表記へ 10進表記を8進表記へ 例:010 = 1*8 + 0 = 8 011 = 1*8 + 1 = 9
017 = 1*8 + 7 = 15, 020 = 2*8 + 0 = 16. 10進表記を8進表記へ 23 = 2 * = 027 36 = 4 * = 044 73 = 1 * 8^2 + 1 * = 0111
8
整定数(つづき2) 16進表記から10進表記へ 10進表記から16進表記へ 0x10 = 1 * 16 + 0 = 16,
0x19 = 1 * = 25, 0x1a = 1 * = 26, 10から15までに、aからfを当てる 10進表記から16進表記へ 23 = 1 * = 0x17 321 = 1 * 16^2 + 4 * = 0x141.
9
整定数(つづき3) 2進定数はないが、後で使うので、2進表記の話.各桁に0, 1のみを使う 2進表記から10進表記へ
(10) = 1*2+0*2^0=2, (11)=1*2+1*2^0=3, (100)=1*2^2+0*2^1+0*2^0=4,… 10進表記から2進表記へ 5=1*2^2+0*2^1+1*2^0 = (101),…, 8 = (1000),
10
b進表記 bを勝手な自然数とする 任意の自然数nは、
n = d_r*b^r + d_(r-1)*b^(r-1) +・・・+d_1*b + d_0, (0≦d_i < b, i = 0,……r) と表される. bを基数(radix)、各d_iをdigitという.
11
b進表記の求め方 (1) nをbで割った余りをdとする. (2) dをこの回に求めたdigitとして出力
(3) (n-d)が0でなければ、(n-d)/b を新たにnとして、(1)に戻る.(n-d)が0なら、終了. (3)から(1)へ戻るときに、nが真に減少する((n-d)/bはnをbで割った商)ので、必ず停止する.
12
浮動小数点定数 常に10進表記 float, double, long doubleの3種あり 例 0., .0 1.0, 1.0f
3e1, 1.0E-3, 1.0e67L
13
文字定数・文字列定数 文字定数 文字列定数 例: ‘a’, ‘b’, ‘c’, …… ‘A’, ‘B’, ‘C’,…… ‘ ‘,…… 例
“ABC”, “abc”, “hello world”,……
14
型 型:値の集合と、それらの値に対して行われる演算の集合を組にしたもの 例:整数型、浮動小数点数型、文字型 Cには文字列型は存在しない!
文字型の配列として実現されている
15
変数を使う 値を保存できるモノ 保存するものの型に応じて、変数も型を持つ
16
変数を使う(続き) 使う前に「宣言」する必要がある 先頭で宣言する. 宣言の仕方:
型 変数名; int i; double a; コンパイラに対して、その型の値を保持できる場所を確保し、変数名で識別せよ、という指令を出している.
17
変数を使う(続き2) #include <stdio.h> #include <stdlib.h>
#include <math.h> int main (int ac, char *av[]) { double arg; if (ac < 2) exit (EXIT_FAILURE); arg = atof (av[1]); printf (“square root of %f = %f.\n", arg, sqrt (arg)); return 0; }
18
変数を使う(例3) double arg; argというdouble型の変数を導入し、atof(av[1])の値を保存.
19
コンパイルとは何か? 人間が読めるCのソースを、コンピュータが実行できる形式に翻訳する
プリプロセス、コンパイル、アセンブル、リンク、の過程に分かれる.
20
コンパイルの各過程(1) プリプロセス コメント(/* */で挟まれた部分)を空白に置き換える
#include <ファイル名.h>を、そのファイルの内容と置き換える その他(定数の定義、条件コンパイルなどプリプロセッサの他の機能は後の回で紹介します)
21
コンパイルの各過程(2) コンパイル アセンブラ? プリプロセスがすんだCのソースを、アセンブラへ翻訳 機械語ともいう.
CPUに直接命令する形式の、機械に密着したレベルの言語 まだ人間が読める(端末に表示できる)
22
コンパイルの各過程(3) アセンブル アセンブラを、コンピュータが直接実行できるファイルに変換
できたファイルを、オブジェクトファイルともいう この時点で、直接端末に表示することはできない
23
コンパイルの各過程(4) リンク オブジェクトファイルを、最終的な実行可能ファイルに変換する
複数のファイルからなるプログラムなら、それらを一つに結合 標準ライブラリ関数、もし必要であれば数学関数など、他のライブラリを結合 スタティックリンクとダイナミックリンク リンカーオプションについての説明.数学関数を使うなら –lm がいるとか.
24
実際に各過程を見てみよう 前回のhello.cを例に、各過程を見る gcc –E hello.c | less gcc –S hello.c
これがプリプロセス後のファイル gcc –S hello.c less hello.s これが、コンパイル後のアセンブラファイル
25
実際に各過程を見てみよう(続) gcc –c hello.c ls hello.o objdump –d hello.o | less
これがオブジェクトファイルとアセンブラの対応 gcc –o hello hello.c objdump –d hello | less これが、実行可能ファイルとアセンブラの対応 リンカが付加した情報が増えている
26
まとめ 定数、型、変数について学んだ 2進、8進、16進表記について学んだ 「コンパイル」の時に、実際は何が行われているのかを学んだ
27
レポート課題 問1 次の計算を行え. 問2 10進の365の2進、8進、16進表記を求めよ 締め切り:2003年5月6日一杯(日本時間で)
問1 次の計算を行え. (1) 02+06, (2) 03*06, (3) 044 / 03 (4) 0x7+0x9, (5) 0x5*0x5, (6) 0x3c/0x8 (6)については、商と余りを求める. 問2 10進の365の2進、8進、16進表記を求めよ 締め切り:2003年5月6日一杯(日本時間で)
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.