GEEK学習ノート——プログラマー面接宝典ノート(一)


メモというのは、個人的なものを比較して、個人的にちょっと面白いと思うものを記録することです~~
プログラマー面接宝典ノート(一)基本概念プログラマー面接宝典ノート(二)前処理、constとsizeofプログラマー面接宝典ノート(三)auto_ptr、再帰プログラマー面接宝典ノート(四)対象向け、タイプ変換、staticプログラマー面接宝典ノート(五)データ構造基礎プログラマー面接宝典ノート(六)ソフトウェアテスト
タイトル
次のコードの結果はいくらですか?
#include<iostream>

using namespace std;

int func(int x)
{
    int ncount = 0;
    while (x)
    {
        ncount++;
        x = x & (x - 1);
    }
    return ncount;
}

int main()
{
    cout << func(9999) << endl;
    return 0;
}

解析
本題func関数の戻り値は,パラメータxがバイナリに変換された後に1を含む数である.9999をバイナリに変換
9999:10011100001111

答え
8
タイトル
次のコードの結果はいくらですか?
#include<stdio.h>

main()
{
    int b = 3;
    int arr[] = {6,7,8,9,10};
    int* ptr = arr;
    *(ptr++) += 123;
    printf("%d,%d
"
, *ptr, *(++ptr)); }

解析
*(ptr++)+=123は*ptr=*ptr+123であるべきである.ptr++は、第1の要素が129であり、ptrは第2の要素7を指す.printf("%d,%d",ptr,(++ptr);右から左に演算すると、1つ目は(++ptr)、すなわちptr+,*ptr=8であり、このときptrは3番目の要素8を指すので、すべて8である.
答え
8,8
タイトル
次のコードコメントの結果はいくらですか?
#include <iostream>

using namespace std;

int main()
{
    float a = 1.0f;
    cout << (int)a << endl;
    cout << &a << endl;
    cout << (int&)a << endl;
    cout << ((int)a == (int&)a) << endl;//    

    float b = 0.0f;
    cout << (int)b << endl;
    cout << &b << endl;
    cout << (int&)b << endl;
    cout << ((int)b == (int&)b) << endl;//    
}

解析
機械を動かしてみると、「cout<<(int&)a<答え
0 1
タイトル
次のコードの結果はいくらですか?
#include <iostream>

using namespace std;

int main()
{
    unsigned char a = 0xA5;
    unsigned char b = ~a >> 4 + 1;
    cout << (int)b << endl;
    return 0;
}

解析
この問題は2つの知識点を考査する:1つはタイプ転換問題である.二つ目は演算子の優先度の問題です.最初の質問:unsigned char b=~a>>4について、この式を計算するとき、コンパイラは、まずaと4の値をintタイプ(いわゆる整数昇格)に変換してから計算を行い、計算結果が出た後、unsigned charに変換してbに付与します.2つ目の問題は、「~」の優先度が「>>」と「+」より高いためです.,本題の過程は,まず1010 0101に対して0101 1010を逆にとる.さらに右に移動すると、ここで問題があります.まず右に4位を移動してから1を加えるのですね.やはり直接5(4+1)位を右に移動します.「+」の優先順位は「>>」ですから.ということで、そのまま右に5桁移動.結果は0000 0010.最後の結果は2が正しいはずですが、上記のコマンドをCodeBlocksに入れて実行し、答えは250です.実際にマシンでは0 xA 5の預かりで0000,1010,0101,取反は1111,1111,0101,1010と表現されているが,右シフト5ビットは0000,0111,1111,1010であり,unsigned char型であるため8ビット低い値,すなわち250しか表示できない.
答え
250
タイトル
1つの式で、1つの数Xが2^N次数(2,4,8,16,...)であるか否かを判断し、ループ文は使用できない.
解析
2、4、8、16のような数をバイナリに変換すると10、100、1000、10000である.Xが1を減らしてXと演算し,答えが0であればXは2 N次である.
答え
!(X&(X-1))
タイトル
次のコードの出力結果は何ですか?
#include <iostream>

using namespace std;

int func(int x, int y)
{
    return(x&y) + ((x^y) >> 1);
}
int main()
{
    cout << func(729, 271) << endl;
    return 0;
}

解析
もちろん、バイナリに変換してビットと計算することができます.しかし、これは明らかに面接官が期待していたものではない.問題をよく見ると、x&yは同じビットをとることであり、この結果はxとyの同位の半分に相当し、x^yはxとyの同位をとることであり、右シフトは2で割ることに相当するので、この関数の機能は2つの数の平均値をとることである.(729+271)/2=500.
答え
500
タイトル
C++プログラムでCコンパイラによってコンパイルされた関数を呼び出すには、なぜextern「C」を付けるのですか?
答え
C++言語は関数リロードをサポートし、C言語は関数リロードをサポートしない.関数がC++でコンパイルされた後のライブラリ内の名前はC言語とは異なる.ある関数のプロトタイプがvoid foo(int x,int y)であると仮定する.この関数はCコンパイラによってコンパイルされた後のライブラリ内の名前は_foo、C++コンパイラは像_を生成しますfoo_int_intとかの名前.C++は、C接続交換指定シンボルextern"C"を提供し、名前マッチングの問題を解決します.