case 定数:とdefault:はラベル。上から昇順に定数を数値で指定した場合には、break文を検出するまで、ヒットした行からすべて実行する。
【反復1】はfor文、while文、【反復2】はdo-while文
while文、for文との違いは標準入力(キーボード)から受け取る場合に一度入力を行わずに式の判定ができないため、二度同じ文が必要になることがある。これを避けるためにdo文を活用することで一度の記述で済む。
補足:何らかの状態や結果を真理値として保持する変数を「フラグ」と言う。
論理演算子・条件演算子の評価時に||は左から順に一つでも条件に合致する場合、&&は一つでも条件に合わない場合に後半の評価を省略する。これを「短絡評価」という。
| 優先順位 | 演算子 | 結合 |
|---|---|---|
| 1 | ()(関数呼び出し) [] . -> ++(後置) --(後置) | 左 |
| 2 | ++(前置) --(前置) +(単項) -(単項) ~ &(単項) *(単項) ! sizeof | 右 |
| 3 | ()(キャスト) | 右 |
| 4 | *(二項) / % | 左 |
| 5 | +(二項) -(二項) | 左 |
| 6 | << >> | 左 |
| 7 | < <= > >= | 左 |
| 8 | == != | 左 |
| 9 | &(二項) | 左 |
| 10 | ^ | 左 |
| 11 | | | 左 |
| 12 | && | 左 |
| 13 | || | 左 |
| 14 | ?: | 右 |
| 15 | = += -= *= /= %= <<= >>= &= ^= |= | 右 |
| 16 | , | 左 |
文字か数値はデータ自体に意味付けされていない。扱える桁数は(bit数も)処理系に依存する。C99ではint32_t(32bit),uint64_t(64bit)など、ビット数が決まった型が用意されている。
short型にint型となるような数値リテラルを代入しようとするとき、数値はshort型として型変換され認識される。型に入らない容量の場合の型変換後の数値は処理系によって異なる。
関数の呼び出しにおいても引数の読み込み時や戻り値の代入時には暗黙の型変換が行われることがある。[float f2 = (float)sqrt((double)f1);]
3 * 2.5の場合は[(double)3 * (double)2.5]として計算される。
int型の負の値xをunsigned int型に変換すると、[(unsigned int型で表現できる最大値) + x + 1]となることが規格で定められている。(2の補数表現)
| ビット数 | 表現できる数の範囲 |
|---|---|
| 8ビット (1バイト) | 0~255 |
| 16ビット (2バイト) | 0~65,535 |
| 32ビット (4バイト) | 0~4,294,967,295(約43億) |
| 64ビット (8バイト) | 0~18,446,744,073,709,551,615(約1845京) |
最上位のビット(MSB:Most Significant Bit)で正負を表す。符号フラグ
:MSBが1で残りのビットがすべて0の場合:-2^x-1
:MSBが0で残りのビットがすべて1の場合:2^(x-1)-1
| ビット数 | 表現できる数の範囲 |
|---|---|
| 8ビット (1バイト) | −128~127 |
| 16ビット (2バイト) | −32,768~32,767 |
| 32ビット (4バイト) | −2,147,483,648~2,147,483,647(約−21億~21億) |
| 64ビット (8バイト) | −9,223,372,036,854,775,808~9,223,372,036,854,775,807(約−922 京~922京) |
固定小数点と浮動小数点
(符号)(仮数) × (基数)(指数)
sizeof(型名)
sizeof 式
01010011と00111010ならば00010010
01010011と00111010ならば01111011
01010011と00111010ならば01101001
01010011ならば10101100
01010011を3bit左シフトすると10011000
10101100を3bit右シフトすると0001010
| 演算子 | 複合演算子 | 役割 |
|---|---|---|
| a & b | a &= b | aとbのビット単位の論理積 |
| a | b | a |= b | aとbのビット単位の論理和 |
| a ^ b | a ^= b | aとbのビット単位の排他的論理和 |
| ~a | a = ~a | aのビット反転 |
| a << x | a <<= x | aをxビット左シフト |
| a >> x | a >>= x | aをxビット右シフト(負でない整数:論理右シフト、負の整数:処理系依存) |
| 演算子 | 役割 |
|---|---|
| a && b | aとbの両方とも0以外であれば1(真)、そうでなければ0(偽) |
| a || b | aとbの片方でも0以外であれば1(真)、そうでなければ0(偽) |
| !a | aが0であれば1(真)、そうでなければ0(偽) |
| 書式 | rand() |
|---|---|
| 引数 | なし |
| 戻値 | 0以上RAND_MAX以下の乱数(int) |
| 必要ヘッダ | stdlib.h |
この関数の乱数は何度、実行を繰り返しても同じ値になる。このような乱数はまたは、と呼ばれる
| 書式 | srand(seed) |
|---|---|
| 引数 | 非負整数seed(unsigned int型) |
| 戻値 | なし |
| 必要ヘッダ | stdlib.h |
srandを利用してもプログラムの実行ごとに異なる乱数を与えることができないためtime関数を利用する
| 書式 | time(NULL) | |
|---|---|---|
| 引数 | この授業では"NULL"を指定 | |
| 戻値 | 現在時刻を表す値(time_t型) | |
| 必要ヘッダ | time.h |
特定の範囲の乱数を作る:rand() * n /RAND_MAX 「0以上n以下の乱数」
| 記入法 | 説明 |
|---|---|
| 変数型 変数名[n] = {値1,値2,...,値n} | 配列の初期化(要素数指定あり) |
| 変数型 変数名[] = {値1,値2,...,値n} | 配列の初期化(要素数指定なし) |
| sizeof(配列)/sizeof(配列[0]) | 配列の要素数 |
上記の変数では以下のようになる
| 操作 | 正しい式 | 誤った式 |
|---|---|---|
| アドレスの代入 | cp = &c | *cp = &c; |
| アドレスの取り出し | printf("%p",cp) | printf("%p",&cp) |
変数aの*&aという表記で参照すれば通常の変数aの持つ値を示す
トップへ戻るポインタへの足し算引き算は、1バイト単位ではなく、1要素ごとである
C言語で配列を関数へ渡す際には、ポインタを利用する
C言語では配列の長さ等を扱う場合にはsize_t型を利用することが推奨されていて、一般的。
const付きポインタには代入は可能であるが、ポインタが指すオブジェクトへの値の変更は不可になる。constは仮引数にもつけることができる
2次元配列は、1次元配列同様、メモリ上の連続した領域が割り当てられる
2次元配列aをa[n]で表現した場合の評価はポインタで&a[n][0]と同一である
トップへ戻る'シングルクォーテーションで囲んだ一文字をと言う。
ダブルクォーテーションで囲んだ文字列をと言う。
※ポインタでは文字列リテラル中の文字を書き換えることは許容されていない。ただし、文字列リテラル自体を書き換えることは可能。(その場合は新たにメモリ領域が確保される?ex158.cで確認したところアドレスは変更されている。)。また、char型配列では文字を変更できるようだ。
char型の配列に演算子=を使ってchar型の配列を代入することはできない。
| 書式 | strlen(s) |
|---|---|
| 引数 | 文字列s (const char *型) |
| 戻り値 | sの長さ (size_t型) |
| 必要ヘッダ | string.h |
| 書式 | strcpy(dest,src) |
|---|---|
| 引数 | コピー先の配列dest(char *型)と文字列src(const char *型) |
| 処理 | srcが指す文字列を、ヌル文字を含めdestが指す配列にコピーする。 |
| 戻り値 | destの値(char *型) |
| 必要ヘッダ | string.h |
| 書式 | strchr(s,c) |
|---|---|
| 引数 | 文字列s(const char *型)と文字c(int型) |
| 戻り値 | sにcが含まれていれば、sの中で一番先頭にちかいcへのポインタ(char *型)。含まれていなければNULL。 |
| 必要ヘッダ | string.h |
| 書式 | strcmp(s1,s2) |
|---|---|
| 引数 | 文字列s1とs2(いずれもconst char *型) |
| 戻り値 | s1がs2より大きければ0より大きい整数、等しければ0、小さければ0より小さい整数(int型)。文字列の大小は、文字コードを基準にした辞書順。 |
| 必要ヘッダ | string.h |
| 変換指定 | 役割 |
|---|---|
| %c | 読み取った文字をchar型の変数に格納する。 |
| %d | 読み取った整数をint型の変数に格納する。 |
| %u | 読み取った非負整数をunsigned int型の変数に格納する。 |
| %lf(エル・エフ) | 読み取った小数をdouble型の変数に格納する。 |
| %s | 読み取った文字列をchar型の配列に格納する。 |
2つの文字列が等しいかは演算子==を利用しては判定ができない