/*
から*/
までが注釈//
から行末までという形も可(bcc32でも使用可能)
"
〜"
)で囲んだもの
\n, \a
)
(\n, \a
)
など特別な表記Q. 文字列リテラルの中に二重引用符("
)や、
バックスラッシュ(\
)を入れたい時はどうするか?
Q. printf
関数でパーセント記号(%
)そのものを出力したい時はどうするか?
箱
scanf
関数の問題点
次のような問題点があるため、実用的なプログラムでは使うことは少ない。
(例えば、fgets
関数とsscanf
関数の組み合わせを使う。)
getchar
関数など)と組み合わせて使うと、
直観に反する動作をする。
つまり、scanf
関数の使用は、次のように自主規制すると良い。
scanf
関数単独で使用し、他の入力関数と併用しない。%d
や%lf
という変換指定だけを使う。分類 | 一般形 | 補足説明 |
---|---|---|
変数 | x , i など、教科書 p.82も参照 | |
整数リテラル | 1 , 0 , 100 , 0xff など | |
文字列リテラル | "Hello!\n" など | |
関数呼出し | 関数名 ( 式 , ... , 式 ) |
printf("Hello\n") など |
単項演算子 式 | 単項演算子は +,-,!,~,& など | |
式 二項演算子 式 | 二項演算子は +,-,*,/,=, など | |
( 式 ) |
演算の順番を指定するためカッコで囲んだもの |
分類 | 一般形 | 補足説明 |
---|---|---|
式文 | 式 ; | 式は通常、代入式か関数呼出しのように副作用があるもの |
return文 | return 式 ; |
式の周りにカッコは必要なし |
/
演算子/
演算子は両オペランドがint
型のとき、
結果もint
型(つまり切り捨て)になる。
つまり、1/10
は 0.1ではなく、0になる。
Q. 次のプログラム(の断片)のうち、0.1と表示されるものを選べ。
1 | 2 | 3 | 4 | 5 |
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
型と暗黙の型変換double
型を使う。
(float
というdouble
よりも精度が低い型もあるが、あまり使われない。)int
とdouble
が混じっている時は、
int
がdouble
に暗黙に型変換される。
int | double | |
---|---|---|
printf | %d | %f |
scanf | %d | %lf |
説明 | 例 | 出力 |
---|---|---|
桁数を揃える | printf("[%3d]", 1) | [ 1] |
先頭を0で埋める | printf("[%03d]", 1) | [001] |
小数点以下の桁数を指定する | printf("[%.3f]", M_PI) | [3.142] |
16進数で表示する | printf("[%x]", 127) | [7f] |
分類 | 一般形 | 補足説明 |
---|---|---|
浮動小数点数リテラル | 3.14, 2.0, 6.02e23, 6.626e-34など、(教科書 p.27) | |
キャスト | ( 型 ) 式 | 明示的な型変換(教科書 p.31) |
{
〜}
で囲んで、
文法上一つの文として扱える。
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
のとき右オペランドは計算されないのでエラーは発生しない。
分類 | 一般形 | 補足説明 |
---|---|---|
if文 | if ( 式 ) 文 | (教科書 p.36) |
if〜else文 | if (式 ) 文 else 文 | (教科書 p.38) |
複合文(ブロック) | { 宣言 ... 文 ... } | (教科書 p.50) |
switch文 | switch ( 式 ) 文 | (教科書 p.54) |
ラベル付き文 | case 整数リテラル : 文 | (教科書 p.54) |
default : 文 | ||
break文 | break ; | (教科書 p.55) |
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 回繰り返す |
A | B | C |
---|---|---|
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); |
if文やwhile文, for文は、文法上必要のないところでも、{
,
}
で囲んでブロック(複合文)にして、間違いが起こる可能性を減らすべきである。
分類 | 一般形 | 補足説明 |
---|---|---|
式 ? 式 : 式 | ? : は三項演算子とも呼ばれる(教科書 p.48) | |
式 後置演算子 | 後置演算子は ++,-- のみ(教科書 p.66) |
x++
と++x
の違いは?
分類 | 一般形 | 補足説明 |
---|---|---|
do〜while文 | do 文 while ( 式 ) ; | (教科書 p.60) |
while文 | while ( 式 ) 文 | (教科書 p.68) |
for文 | for ( 式 ; 式 ; 式 ) 文 | (教科書 p.74) |
continue文 | continue ; | (教科書 p.82) |