最初の質問
1. 関数 void f(int x); の場合、以下の正しい呼び出しは () です。
A:int y = f(9);
B:f(9);
C:f( f(9) );
D:x=f();
答案及解析 B
関数呼び出しは、渡された戻り値とパラメータが正しいかどうかによって決まります。
A: エラーです。この関数には戻り値がありません。
B: 正しい。
C: エラー。f(9) には戻り値がないため、f 関数のパラメータとして使用できません。
D: エラー。f 関数は変数に代入できないため、パラメーターを渡す必要があります。
質問2
2. コンパイラで int 型の長さが 32 ビット、short 型の長さが 16 ビットであると指定されており、y を取得するマシンの数が ( ) であるとします。
unsigned short x = 65530;
unsigned int y = x;
A:0x0000 7FFA
B:0x0000 FFFA
C:0xFFFF 7FFA
D:0xFFFF FFFA
答案及解析 B
この質問は、暗黙的な型変換をテストします。2 つの変数 x と y は両方とも符号なし型ですが、x は short 型です。値を y に割り当てると、一時変数がコピーされ、一時変数は暗黙的に y に型変換されます。次に、型は下位ビットから上位ビットであるため y に割り当てられ、変換中に整数型が昇格されます。これらはすべて符号なしの数値であり、上位ビットは 0 で埋められ、結果は変わりません。
図:
質問3
3. x=254 の場合、関数の戻り値は次のようになります。
int func(int x)
{
int countx = 0;
while(x)
{
countx ++;
x = x & (x - 1);
}
return countx;
}
答え:6
B:7
子:8
D:0
答案及解析 B
この質問はビット演算をテストします:一般的なビット演算の包括的な公式 (失われた場合に備えて収集することをお勧めします) - CSDN ブログ
x & (x - 1) は 2 進数の右端の 1 を削除するため、countx は合計で 1 がいくつあるかを計算します。
x = 254
バイナリ: 0000 1111 1110 全部で 7 つあるため、結果は 7 になります。
質問4
4. 次のプログラムでは、文字列 abc が入力された場合、関数 f の機能は文字列 abc を *abc に変換して出力することです。横線 ( ) に適切なプログラムを選択してください。
void f(char str[5])
{
int i = strlen(str) - 1;
while (i >= 0)
{
str[i + 1] = str[i];
i--;
}
_________________;
printf("%s\n", str);
}
A:str[ i + 1 ] = ' *'
B:str[ i ] = ' *'
C:str[ 1 ] = ' *'
D:str[ i - 1 ] = ' *'
答案及解析 A
関数 abc が *abc になることを実現するには、データを 1 つずつ移動してカバーする必要があります。ループの機能は、文字列を全体として後方に移動し、その後、その最初の位置にある要素を変更することです。横線を*に
最初のタイプ: str[0] = ' * ';
2 番目の方法は i を使用する方法です。この時点では i はすでに -1 なので、次のようにすることもできます: str [ i + 1 ] = ' * '
質問5
5. 定義: int a[4][10] がある場合、次のオプションのうち、配列要素 a[i][j] への誤った参照は () です。
A:*(a + i) + j
B:*(&a[ 0 ][ 0 ] + 10 * i + j)
C:*(a[ i ] + j)
D:*(*(a + i) + j)
答案及解析 A
配列要素を参照します。ここでは説明の便宜上、i 値を 1 に、j 値を 2 に設定します。
A: a は 2 次元配列の名前と配列の最初の要素のアドレスで、2 次元配列の最初の要素は 1 次元配列全体です。
2 次元配列の配列名は 1 次元配列のアドレスであり、a = &a[0] と同等、a + i は &a[0] + 1 = &a と同等です。 [1] (1 つ後方に移動することを意味します) 配列のアドレス、*(a + 1) = *&a[1] = a[1] を逆参照するため、逆参照後の 1 次元配列要素のアドレスa[1] + 2 = a[3] が得られます。これは、配列要素ではなく、配列の 4 番目の要素のアドレスです。
B: 正解です。最初に配列要素のアドレスを取得し、次にポインタ + 整数を実行してから逆参照します。それは配列要素である必要があります。
C: 2 次元配列の行は行の最初の要素のアドレスを表し、外側の層が逆参照されると配列要素が取得されます。
D: ここに 2 つの逆参照があります。 *(*(a + i) + j) = *(a[ i ] + j) = a[ i ][ j ];