C 言語 - 毎日の多肢選択問題 - Day51

最初の質問

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

答案及解析

この質問は、暗黙的な型変換をテストします。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 ];

おすすめ

転載: blog.csdn.net/2302_76941579/article/details/135035655