C 言語復習 C 言語の基礎 来週もこの資料を持参してください C 言語, ソースファイルの作成, コンパイル, 実行 1 C 言語 C 言語プログラミングの手順 とは, 計算機を動かす手順を記述したもの. 計算機に命令を与えて動かすには を作成する ことになる. C 言語はプログラミング言語の 1 個 手続き型言語に分類される. C/C++ は非常に多くの場面で使われる言語 C++ は C 言語をオブジェクト指向に拡張したもの 3 ソースファイルを作成し, コンパイルし, 実行. hello.c ソースファイル source file C 言語人間が記述する. コンパイルする compile コンパイラ compiler (Visual C++, gcc, bcc など ) hello.exe 実行ファイル executable exe マシン語通常人間に読めない C 言語では, ソースファイルを直接実行することができない. ソースファイルをコンパイルして実行ファイルを作成し, 実行ファイルを実行する. ソースファイル を 原始ファイル と呼ぶこともある ( ごくまれ ). 実行ファイルの拡張子は OS に依存する.Windows では.exe となる. 厳密には, コンパイルとリンク (link) を行い実行ファイルを作る. 4 コンパイルとリンク C 言語のソースファイルの骨格 エディタ ソースファイル abc.c エディタ ソースファイル def.c コンパイラコンパイルコンパイラコンパイル オブジェクトファイル abc.o オブジェクトファイル def.o リンカ リンク 実行ファイル xyz.exe と で本体を挟む ヘッダ (header) ファイルの読み込み. 先頭に必ず書く. ここにの本体を記述する. 標準ライブラリ 5 と で本体を挟む 6 何も起きない 文字列を表示する 1 3 4 1 3 4 printf("hello, n"); 5 半角で記述する. 大文字と小文字は明確に区別される. 上記を入力し, 実行する. Error メッセージ,Warning( 警告 ) メッセージを確認する. Error は明確な誤りへのメッセージ Warning は誤りではないが好ましくないことへのメッセージ Hello world! と表示する. printf を使えば, で囲った文字列を表示できる. n は, 改行を意味する. printf( Hello n n ); として実行. 動作を確認. 7 8
C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a 10 3+4 a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は式 ; printf("hello"); a=3; a++; a; 正しいが, 通常あり得ない 9 10 文字列を表示する インデントとフリーフォーマット 1 3 4 5 printf("c lang. n"); 6 7 上から下に進む for(i=0; i<5; i++){ printf("i=%d n", i); for(i=0; i<5; i++){ printf("i=%d n", i); for(i=0; i<5; i++){ printf("i=%d n", i); 内の空白,T 文字, 改行は無視される. よって, どのように書いても問題ない. 当然, 見やすく書くことが好ましい. hello01.c 対応関係がわかりづらい. 対応関係が誤り. 11 for(i=0; i<5; i++){ printf("i=%d n", i); 理解が困難. 対応関係が分かりづらい. 1 コメント 1 3 4 /* print hello */ 5 // print hello 6 7 8 /* 9 10 */ 11 hello0.c /* と */ で挟まれた領域は, コメントとして無視される. 実行されない. // から行末までの領域も, コメントとして無視される. 実行されない. ただし, これは C++ の機能であり C 言語の機能ではない. ( 実際はほとんどの C 言語のコンパイラにこの機能が付いている ) コメント部にはデタラメに書いても問題ない. 正しい C 言語の文も無視される. 数値計算を行う 変数, 演算 13 14 演算結果の型 X 型と X 型の演算結果は X 型. int a=7, b=; double d; d = a + b; d = a / b; a + b は int 型と int 型の演算. 演算結果も int 型. a+b は 9 (int 型 ). d には 9.0 (double 型 ) が入る. a / b は int 型と int 型の演算. 演算結果も int 型. a / b は 3 (int 型 ). d には 3.0 (double 型 ) が格納される. 3.5 は格納されない. 演算結果の型 X 型と Y 型の演算結果は XorY 型. 優先度の高い型が勝つ. double > float > long > int > char の優先順 int a=7; double d=.0, e; e = a / d; a / b は int 型と double 型の演算. double 型が勝つので, 演算結果は double 型. 7.0 /.0 と解釈され, 演算結果は 3.5 (double 型 ). 15 16
演算結果の型 double d; d = 7 / ; /* int と int の演算. 結果は int の 3 */ d = 7 /.0; /* int と double の演算. 結果は double の 3.5 */ d = 7.0 / ; /* double と int の演算. 結果は double の 3.5 */ d = 7.0 /.0; /* double と double の演算. 結果は double の 3.5 */ 制御文 17 18 真偽 比較演算子 条件が成り立つ場合, その条件式は真である. 例えば, (3 < 4) は真 true (3 == 4) は偽 false a==b : a と b が等しい a!=b : a と b が等しくない a<b : b は a より大きい a<=b : b は a 以上 ( 大きいか等しい ) a>b : a は b より大きい a>=b : a は b 以上 注意! 19 比較 a==b 代入 a=b OK!= <= >= NG =! =< => 0 論理演算子 条件 && 条件論理積 (and): 両方成り立つ場合に真 条件 条件論理和 (or): 少なくとも片方が成り立つ場合に真 if( 条件式 X ){ 式 X が真の場合 ( 成り立つ場合 ), 中身 ( ) が実行される. 偽の場合 ( 成り立たない場合 ) は何も実行されない.! 条件否定 (not): 条件が成り立たないときに真. 真偽が逆転される if( 条件式 X ){ else { 条件 X が真の場合前半の が実行され, 偽の場合 ( 成り立たない場合 ) 後半 (else 部 ) の が実行される 1 if( 条件式 X ){ else if( 条件式 Y ){ else if( 条件式 Z ){ C else { D E 条件式 X が成り立つ場合, が実行され, その後 E に移る.,C,D は全て 条件式 X の else の中にあるため, たとえ条件式 Y や条件式 Z が成り立っても実行されない. 条件式 X が偽の場合に限り, 条件式 Y が検証される. 条件式 X が偽でかつ条件式 Y が真の場合, が実行され, E に移る. C,D は実行されない. 条件式 X が偽, 条件式 Y が偽, 条件式 Z が真の場合, C,E が実行される. 全てが偽の場合, D, E が実行される. 1 3 int a=1; 4 5 printf("a < 10 (a = %d) n", a); 6 else { 7 printf("10 <= a (a = %d) n", a); 8 9 3 4
1 3 int a=8; 4 5 printf("a < 10 (a = %d) n", a); 6 else { 7 printf("10 <= a (a = %d) n", a); 8 9 5 int a=8; 6 int a=1; 7 int a=3; if( 10 <= a ){ if( 0 <= a ){ if( 30 <= a ){ 8 int a=8, b=8; if( b < 10 ){ else { else { if( b < 7 ){ else { printf("d n"); if( b < 10 ){ else { else { if( b < 7 ){ else { printf("d n"); D おまけ著しく読みづらいソースコード 9 30 if( b < 10 ){ else { else { if( b < 7 ){ else { printf("d n"); if( a < 10 && b < 10 ){ else { 31 3
if( a < 10 b < 10 ){ else { if(! (a<10 b<10) ){ else { 33 34 真偽 厳密には,C 言語には条件や真や偽はない. 同じ処理を何度も繰り返すには for 文を使う. 値 ( 式分 ) が 0 以外 なら真, 0 なら偽とみなす. 注意 :NULL は 0 なので偽である. for( i=0; i<5; i++){ 処理 ; 処理 を 5 回繰り返す. Hello! Hello! Hello! if( 1+ ){ 3 は真を意味する. if( 4-4 ){ 結果, に入る 例 printf("hello! n"); else { else { 結果 0 は偽を意味する. 結果, に入る for(i=0; i<7; i++){ C 言語になれるまでは, このような変な (?) 表現は使わなくて良い. 35 36 結果 i=0 として i=1 として i= として (i=0; i<3; i++) i が 0 から 3 未満の範囲で ( まで ), i=0 i が 0 から始まる. i<3 i が 3 未満である限り続ける i++ i は 1 ずつ増える i が 0 から 3 未満 ( まで ) なので, i =0, i =1, i= の 3 回繰り返す. 37 for(i=10; i<13; i++){ for(i=0; i<6; i+=){ for(i=; 0<=i; i--){ i が 10 から始まり 13 未満の範囲で (1 まで ), 結局,i=10, i=11, i=1 の 3 回繰り返す. i が 0 から始まり 6 未満の範囲で, 繰り返す.i は ずつ増える. という意味の繰り返し. 結局,i=0, i=, i=4 の 3 回繰り返す. i が から始まり 0 以上の範囲で, 繰り返す.i は 1 ずつ減る. という意味の繰り返し. 結局,i=, i=1, i=0 の 3 回繰り返す. 38 for(i=10; i<3; i++){ for(i=3; 0<=i; i++){ i が 10 から始まり,3 未満の範囲で, 結局,(10<3 が偽なので )1 回も実行しない. i が 3 から始まり,0 以上の範囲で, 結局, 無限に繰り返す. 動作原理 printf("end n"); N i=0; Y for(i=0; ; i++){ i が 0 から始まり, 無条件で, 結局, 無限に繰り返す. 39 i++; printf("end n"); 40
動作原理 終了 i=0; i++; /*i=1 となる */ i++; /*i= となる */ i++; /*i=3 となる */ 41 for( 式 1; 式 ; 式 3 ){ 最初に式 1 を行う 式 が真である限り, ブロックの中身を繰り返す. 1 回繰り返すたびに式 3 を行う. for (i=0; i<; i++){ i が 0 になる. i< の真偽を調べる. 真である (i=0). よって,for の中のブロックに入る. ブロックが終わり,i++ を行い, ブロックの最初に戻る. i< の真偽を調べる. 真である (i=1). よって,for の中のブロックに入る. ブロックが終わり,i++ を行い, ブロックの最初に戻る. i< の真偽を調べる. 偽である (i=). よって,for を終了する. 4 for 文の中に for 文 for(j=0; j<4; j++){ 同義 for 文の中に for 文 for(j=0; j<4; j++){ printf("i=%d,j=%d n",i,j); 黄 :Hello と 1 回表示. 青 :Hello と 4 回表示. 黄色を 4 回繰り返す. 結果,4 回 3 回 =1 回繰り返す. printf() を j=0~3 の 4 回繰り返す を i=0~ の 3 回繰り返す. 結果,4 回 3 回 =1 回繰り返す. 43 44 繰り返し while 文 繰り返し do-while 文 while( 条件式 X ){ 条件 X が真である限り, 中身 ( ) を繰り返し実行する. 毎回, 条件式を評価してから, を実行する. int i=0; while( i< ){ i++; i が 0 になる. i< の真偽を調べる. 真である (i=0). よって,while の中のブロックに入る. i++ により i が 1 になる. ブロックが終わり, ブロックの最初に戻る. i< の真偽を調べる. 真である (i=1). よって,while の中のブロックに入る. i++ により i が になる. ブロックが終わり, ブロックの最初に戻る. i< の真偽を調べる. 偽である (i=). よって,while を終了する. 45 do{ while( 条件式 X ); 条件 X が真である限り, 中身 ( ) を繰り返し実行する. 毎回, を実行してから, 条件式を評価する. よって, 最低でも 1 回は実行される. int i=0; do{ i++; while( i< ); i が 0 になる. i++ により i が 1 になる. ブロックが終わり,i< の真偽を調べる. 真である (i=1). よって, 再度,while ブロックの中を実行. i++ により i が になる. ブロックが終わり,i< の真偽を調べる. 偽である (i=). よって, 再度,while ブロックの中を実行. 46 break による繰り返しの中断 無限ループ for(i=0; i<10; i++){ if( i==3 ){ break; 繰り返し中断 printf( Fin! n,i); break; を実行すると, 繰り返しが中断される. i=0 i=1 i= i=3 Fin! for(;;){ printf("hello, n"); while(1){ printf("hello, n"); for 文で条件部を書かないと, 無条件で繰り返し. 無限ループとなる. while 文で条件部に 1 と書くと, 条件が必ず成立するので無限ループとなる. (1 は真偽における 真 であるため.) 47 48
例 1, 4, 9, 16, 5, 36,,100 と出力 int i, x; for(i=1; i<=10; i++){ x = i*i; printf("%d n", x); 配列 C 言語 : 変数の宣言と利用 変数の宣言 double d; i = 3; d = 5.7; printf("i=%d, d=%lf n", i, d); i という名前の整数型変数を宣言. 以後 i を使用可能. i は, 整数を格納 ( 記録 ) できる箱. i=3, d=5.700000 d という名前の浮動小数点型変数を宣言. 変数 i に整数 3 を代入. 以後, i には 3 が入っている. 49 51 配列 C 言語 : 配列の宣言と使用 int data[3]; data[0] = 3; data[1] = 4; data[] = 5; printf("data[%d]", i); printf("=%d n", data[i]); int 型が 3 個の配列. data[0]~data[] が使用可能. "0 から始めて,3 未満 " で for 文を使うとやりやすい. 配列の宣言 ( 変数の作成 ) 配列の使用 ( 作成済みの変数の使用 ) data[0]=3 data[1]=4 data[]=5 50 5 C 言語 : 次元配列 int data[3][]; data[0][0] = 3; data[0][1] = 4; data[1][0] = 5; data[1][1] = 6; data[][0] = 7; data[][1] = 8; for(j=0; j<; j++){ printf("data[%d][%d]", i, j); printf("=%d n", data[i][j]); int 型が 3=6 個の配列. data[0][0]~data[][1] が使用可能. 長さ 個の配列 が 3 個. ( 長さ 3 の配列が 個でない ) data[0][0]=3 data[0][1]=4 data[1][0]=5 data[1][1]=6 data[][0]=7 data[][1]=8 53