2013/12/11

C言語Tips5 おしまい!

C言語は言語仕様が大きくないので、また、このサークルではマイコン用途にしか使わないので
余り書くことがありません。
ただし、一通り入門が終わったらガシガシコードを書いていって下さい。
入門書に書いてなさそうなことは、例えば、
・グローバル変数とextern, static
・ファイルの分割と隠蔽
・typedef
・マクロ・インライン関数、インクルードガード
・オブジェクト指向
などがあります。これらも勉強しておくといいかもしれません。

さてC言語Tipsの最後にC言語理解度テストを掲載しておきますね!

0~5問正解 : 初心者でしょう……
6~9問正解 : そろそろ初心者ではないでしょう?

問世界 : もう初心者ではないでしょう!

1. 次の宣言a, b, cについて正しい説明をA~Dのなかから全て選んで下さい。
char a[] = "strings";
char* b = "strings";
char c[] = { 's', 't', 'r', 'i', 'n', 'g', 's', '\0' };

A. aは要素数7の配列である。
B. aとbはともにスタックに格納される。
C. aとcはともにスタックに格納される。
D. 変数aは書き換えられないが、変数bは書き換えられる。

2. 構造体Sが次のように宣言されているとき、s->m->mと等価な表現をA~Dのなかから1つ選んで下さい。
struct S {
    struct S* m;
};

struct S* a;

A. (*a).(*m).(*m)
B. (*a).(*m).m
C. (*(*(*a).m)).m
D. (*(*a).m).m

3. 次の演算の中で1つだけ値が異なるものをA~Dの中から1つ選んで下さい。

A. ~(-0x01)
B. 2 ^ 3
C. 1 && -1
D. -0x03 & 0x03

4. 次のように宣言された配列aにたいして、各要素のポインタを格納する配列bがある。
ある関数fは配列bのある位置(配列bの先頭の位置を0とする)xからある位置yまで探索し、最大値を返す。
関数fの引数として妥当なものを次のA~Dの中から1つ選んで下さい。

int a[8];
int* b[8];

A. int f(int* b, int x, int y);
B. int f(int* b, int* x, int* y);
C. int f(int** b, int x, int y);
D. int f(int** b, int* x, int* y);

5. 次のプログラムを実行した結果の変数xの値をA~Fの中から1つ選んで下さい。
int f(int* x) {
    return (*x)++;
}

int main(void) {
    int x = 0;
    x += f(&x) || f(&x) || f(&x);
 return 0;
}

A. 0
B. 1
C. 2
D. 3
E. 4
F. 5

6. 次の宣言の意味をA~Dの中から1つ選んで下さい。
また、この変数xを使った文として正しいものをX~Zの中から1つ選んで下さい。(ただしN, Mは十分大きいものとします。)
int *(*(*x)[N][M])(void);

A. 変数xはN×Mの2次元配列で、各要素は整数型intのポインタを返す引数なしの関数ポインタである。
B. 変数xは各要素が整数型intのN×Mの2次元配列を返す引数なしの関数ポインタである。
C. 変数xはN×Mの2次元配列のポインタで、各要素は整数型intのポインタを返す引数なしの関数ポインタである。
D. 変数xは各要素が整数型intのN×Mの2次元配列のポインタを返す引数なしの関数ポインタである。

X. *x[1][1] = (int* (*(*)[N][M])())v;
Y. (*x)[1][1] = (int* (*)())v;
Z. ((int* (*)())(*x))[1] = (int* (*)())v;

7. 次のプログラムを実行した結果のf(&x)の値をA~Fの中から1つ選んで下さい。
struct S {
    struct S* s;
};

int f(struct S* s) {
    static int x;
    x++;

    if(s->s == NULL) {
        return x;
    }
    else {
        return f(s->s);
    }
}

int main(void) {
    struct S x;
    struct S s[3];
    int i;

    x.s = &s[0];
    x.s->s = &s[1];
    x.s->s->s = &s[2];
    x.s->s->s->s = NULL;
   
    f(&x); // いくつ?
    return 0;
}

A. 0
B. 1
C. 2
D. 3
E. 4
F. 5

8. a[i][j]と等価なものを次のA~Dの中から全て選んで下さい。

A. i[a][j]
B. i[j][a]
C. i[a[j]]
D. j[i[a]]

9. (++a)++;について正しいものを次のA~Dの中から1つ選んで下さい。

A. a += 2;と等価である。
B. ++aは左辺値でないからコンパイルエラーとなる。
C. ++aは変更不能な左辺値であるからコンパイルエラーとなる。
D. ++が後置式であるからコンパイルエラーである。

10. 型int [][N]と互換性のある型を次のA~Eの中から1つ選んで下さい。

A. int *[N]
B. int (*)[N]
C. int *[]
D. int **
E. int *

正解は……
(正解)
1. C, D
2. D
3. A
4. C
5. D
6. C
7. E
8. A, D
9. B
10. D

なおこのサークルでは1問も正解しなくてもやっていけます(笑

0 件のコメント:

コメントを投稿