10月 12日

第1章

復習

コンパイル
教科書 p.2
ソースファイル(人間が読む・書く形式)を実行ファイル(CPUが直接理解できる形式)などに、 翻訳すること
注釈(コメント)
教科書 p.3
C言語では /*から*/までが注釈
(追加)さらに新しいC言語の仕様(C99)では//から行末までという形も可(bcc32でも使用可能)
文字列リテラル(→リテラル
教科書 p.9
一連の文字を二重引用符("")で囲んだもの
拡張シーケンス(escape sequence)
教科書 p.9
文字列リテラル中の (\n, \a) (\n, \a) など特別な表記

Q. 文字列リテラルの中に二重引用符(")や、 バックスラッシュ(\)を入れたい時はどうするか?
Q. printf関数でパーセント記号(%)そのものを出力したい時はどうするか?

変数
教科書 p.10
数値などのデータを収納するための
Q. 変数名(識別子)の規則をまとめよ。

追加説明

scanf関数の問題点

次のような問題点があるため、実用的なプログラムでは使うことは少ない。 (例えば、fgets関数とsscanf関数の組み合わせを使う。)

つまり、scanf関数の使用は、次のように自主規制すると良い。

文法のまとめ

式 (expression)とは
これまでのところ、
分類一般形補足説明
変数 x, iなど、教科書 p.82も参照
整数リテラル 1, 0, 100, 0xffなど
文字列リテラル "Hello!\n"など
関数呼出し関数名 ( , ... , ) printf("Hello\n")など
 単項演算子 単項演算子は +,-,!,~,&など
  二項演算子 二項演算子は +,-,*,/,=,など
 ( ) 演算の順番を指定するためカッコで囲んだもの
文 (statement)とは
これまでのところ、
分類一般形補足説明
式文 ;式は通常、代入式か関数呼出しのように副作用があるもの
return文return ; 式の周りにカッコは必要なし

第2章

復習

/演算子
教科書 p.19, 28
/演算子は両オペランドがint型のとき、 結果もint型(つまり切り捨て)になる。 つまり、1/10は 0.1ではなく、0になる。

Q. 次のプログラム(の断片)のうち、0.1と表示されるものを選べ。
12345
int z = 1/10;
printf("%d", z);
double z = 1/10;
printf("%f", z);
double z = ((double)1)/10;
printf("%f", z);
double z = 1/((double)10);
printf("%f", z);
double z = (double)(1/10);
printf("%f", z);

double型と暗黙の型変換
教科書 p.27
実数(正確には浮動小数点数)を使う時には、double型を使う。 (floatというdoubleよりも精度が低い型もあるが、あまり使われない。)
オペランドにintdoubleが混じっている時は、 intdoubleに暗黙に型変換される。
変換指定
教科書 p.27
次の表だけは暗記する。(その他は必要に応じて調べる)
 int   double
printf%d%f
scanf%d%lf
高度な変換指定
教科書 p.32
以下のような変換指定は必要に応じて調べれば良い。
説明出力
桁数を揃えるprintf("[%3d]", 1)[  1]
先頭を0で埋めるprintf("[%03d]", 1)[001]
小数点以下の桁数を指定するprintf("[%.3f]", M_PI)[3.142]
16進数で表示するprintf("[%x]", 127)[7f]

文法のまとめ

式(expression)に追加
分類一般形補足説明
浮動小数点数リテラル 3.14, 2.0, 6.02e23, 6.626e-34など、(教科書 p.27)
キャスト( ) 明示的な型変換(教科書 p.31)

第3章

復習

if文
教科書 p.36
条件判断(条件が成り立たない時は何もしない)
if〜else文
教科書 p.38
条件判断(条件が成り立たない時の処理も指定)
複合文(ブロック)
教科書 p.50
(複数の宣言と)複数の文を {}で囲んで、 文法上一つの文として扱える。

追加説明

ぶら下がりのelse (dangling else)
if (hour < 12) if (hour < 6) printf("A"); else printf("B");
という文では elseはどちらのifと対応するか? つまり、どちらの文と等価か?
近くのifなら…遠くのifなら…
if (hour < 12) {
    if (hour < 6) {
        printf("A");
    } else {
        printf("B");
    }
}
if (hour < 12) {
    if (hour < 6) {
        printf("A");
    } 
} else {
    printf("B");
}
論理演算子の評価順
&&||は左のオペランドから評価を行ない。 結果がわかった時点で残りのオペランドは評価しない。
if ( a > 0 && log(a) > -1) ... 
if ( a < 0 || sqrt(a) < 2) ...  
どちらの例もa<0のとき右オペランドは計算されないのでエラーは発生しない。

文法のまとめ

文(statement)に追加
分類一般形補足説明
if文if ( ) (教科書 p.36)
if〜else文if ( ) else (教科書 p.38)
複合文(ブロック){ 宣言 ... 文 ... }(教科書 p.50)
switch文switch ( ) (教科書 p.54)
ラベル付き文case 整数リテラル : (教科書 p.54)
default :
break文break ;(教科書 p.55)

第4章

復習

do〜while文
教科書 p.60
後判断の繰り返し文
文は必ず一回は実行される。
while文
教科書 p.68
前判断の繰り返し文
(つまり、一度も文が実行されないこともある。)
for文
教科書 p.74
ループ変数に関する処理をまとめて書く
for文の決まり文句
教科書 p.76
for (i = 0 ; i < n ; i++) ...   iが 0 から n-1 まで n 回繰り返す
for (i = 1 ; i <= n ; i++) ...   iが 1 から n まで n 回繰り返す
for (i = n ; i > 0 ; i--) ...   iが n から 1 まで n 回繰り返す
for (i = n-1 ; i >= 0 ; i--) ...   iが n-1 から 0 まで n 回繰り返す
自由形式とインデント
教科書 p.84
文字列リテラルの中など特別な場合を除き、改行は空白と同じ扱い、 空白がいくつ続いても、ひとつの空白と同じ扱いになる。 つまりレイアウトはプログラムの意味に影響を与えない。
ABC
if (hour < 12)
   printf("%d時", hour);
   printf("%d分", min);
if (hour < 12) {
   printf("%d時", hour);
   printf("%d分", min);
}
if (hour < 12) {
   printf("%d時", hour);
}
printf("%d分", min);
Aのように書いてもBではなく、Cと同じ意味になる。

if文やwhile文, for文は、文法上必要のないところでも、{, }で囲んでブロック(複合文)にして、間違いが起こる可能性を減らすべきである。

文法のまとめ

式(expression)に追加
分類一般形補足説明
  ? : ?:は三項演算子とも呼ばれる(教科書 p.48)
  後置演算子後置演算子は ++,--のみ(教科書 p.66)
Q. x++++xの違いは?
文(statement)に追加
分類一般形補足説明
do〜while文do while ( ) ;(教科書 p.60)
while文while ( ) (教科書 p.68)
for文for ( ; ; ) (教科書 p.74)
continue文continue ;(教科書 p.82)

戻る


Koji Kagawa(kagawa@eng.〜)