From: XXXXXTo: zephyr@howdyneighbor.com Subject: MS Interview Questions. Hi, Your web-page about the Microsoft Interview was very much useful to me. Thank u very much for that. I had a telephonic Interview last week with Microsoft. I didnt expect such a simple interview from Microsoft. In spite of the Interview being simple, I made few blunders. But, to my surprise, they informed me coupla days ago that they wanted to interview again on this week. I have no idea is it going to be the second level of the interview or else? If you have any idea regarding this and the kind of questions that'd be asked, will u please email me at XXXXXXXXXXX@hotmail.com ? I am herewith sending the questions asked to me. Hope u'll find it useful!!! Please respond this mail ASAP. Bye XXXXXXXX The Interview was 3 phased in C, C++ and Windows Prog. Some of my answers may not be convincing to u. If so, please reply me what do u feel as the correct answer. Q : What is Operator, Operand, Expression, Statement in 'C' ? A : Operators are symbols which take one or two or three operands or expressions and performs arithmetic or logical computations. There are three type of operators in 'C', they are: unary operators binary operators and trenary operators. Operands are variables or expressions which are used as parameters for the operators to evaluate the expression. Expressions can be a combination of operands and operator in a legal structure. Statements are combination of expressions and keywords. Q : Given int a=1, b=2, c=3; what does the following expressions evaluate to? A : a < b will evaluate to TRUE a < b && c < b will evaluate to FALSE a <= c or ? will evaluate to TRUE (a+=3) < c will evaluate to FALSE Q : Given int n, i=10, j=20, x=3, y = 100; what is the value of n and y at the end of each of the foll. expression. A : a) n = (i > j) && (x < ++y); after the expr. the values of n and y will be n = 0 and y = 100. y will not be incremented since the first expression itself evaluates to FALSE. A FALSE anded with any expression is FALSE. So, the second expression will not be evaluated b) n = (j - i) && (x < y++); the result n = 1 and y = 101 c) n = (i < j) || (y+=i); the result n = 1 and y = 100 d) I am afraid I did not note down the 4th expression. Q : int x = 5; int y = 7; what is the value of x and y after the expression y+=x++; A : x = 6 and y = 12 Q : if the expression is y+=++x;, what is the the value of y? A : y will be 13 in this case Q : How do you multiply a variable by 16 without using the multiplication operator '*'. A : We can use bitwise shift operator to achieve the result. Supposing x is a int variable to be multiplied by 16. We can have the expression x <<= 4; to achive the result. Q : What if you have to multiply by 15? A : We can bitwise left shift the variable by 4 times and subtract 16 from the resul. Q : Convert 27 to Hexadecimal notation A : 1B Q : Explain the following declaration : long foo(char); A : it's a function declaration to notify the compiler that foo is a function which takes a char parameter and returns a long variable. Q : write a function declaration for a function which returns int * and takes float, int and char * as parameters A : int * func(float, int, char*) Q : what is the function prototype of printf() in 'C' and what does it return A : int printf(char *, ...); it returns the no. of bytes printed. Here ... means it takes variable no. of parameters Q : int (*a) [10]; a++; What is the value of a after this? A : a will be incremented by 20, assuming the size of int is 2. Q : main() { int *ptr; *ptr=10; } what is wrong with this? A : it will raise an error. Because, ptr does not point to any memory location so assigning a value to it will result in error. Q : typedefine a function pointer which takes a int and float as parameter and returns a float *. A : typedef float* (*fp) (int, float); Q : which of the foll. expression will affect the values of pa or pb A : a) pb - pa; does not affect pa or pb b) ++pa; affects pa c) pa + i does not affect pa or pb d) pa < pb does not affect pa or pb Q : Is the following operation illegal? assume pa and pb as pointers A : a) pa * pb illegal b) pa + pb illegal c) pa - pb legal d) pa << pb illegal Then various questions were asked in C++ and Windows programming. I did not take a note of it. some of them include what is the advantage of OOP? what is polymorphism? the diff. among struct, class and union? recursive function mechanism virtual classes and virtual functions how does Windows prog. differs from DOS prog. what is the advantage of Windows what does winmain and wndproc do? how does user input are trapped in Windows? Windows Messaging mechanism ....... ETC.... The following is the questionire which they sent me to be used while interviewing. But, no questions were asked from this. Q: #include void main(void) { char array1[6] = {"squid"}; char array2[6] = {"llama"}; char *ptr1 = array1; char *ptr2 = array2; printf("*ptr1 = %s\t*ptr2 = %s\n\n", ptr1, ptr2); swap(&ptr1, &ptr2); printf("*ptr1 = %s\t*ptr2 = %s\n\n", ptr1, ptr2); } A : The question is not given for this problem. Assuming, I am asked to find out the output of the program. The first printf would print *ptr1 = squid *ptr2 = llama The second printf functions output cannot be determined unless we know what is done inside the swap(). The swap function takes a pointer to pointer parameter Q : What is the output of the following program? How can the code be changed to give the expected output? #include #define ONE 1 #define TWO 2 #define NEG1 ONE - TWO #define THREE TWO - NEG1 void main( void ) { printf( "ONE = %d\n", ONE ); printf( "TWO = %d\n", TWO ); printf( "THREE = %d\n", THREE ); } A : The output is ONE = 1 TWO = 2 THREE = -1 We have to change the the third macro to #define THREE TWO - (NEG1) to get the desired output Q : #include #include void main(int, char *[]); void foo(int); void main(int argc, char *argv[]) { int x; x = atoi(argv[1]); foo(x); } void foo(int x) { int count=0; while (x) x &= (x-1), count++; printf ("count = %1d\n", count); } Command-line to execute program: >test 5 A : the output is count = 2 Q : Is there anything wrong with the following code? If so, how would you fix it? class X { protected: int a; public: X(int n) { a = n; } }; void somefunction() { X* pX = new X[12]; } A : Yes, it does not have the default constructor. I can add the constructor X::X() {} to the class to fix it Q : Given: class String { int length; char * buffer; public: String(); String(const char *s); ~String(); }; Write the copy constructor for this class. A : String :: String ( const String &s) { length = s.length; buffer = new char[length]; strcpy(buffer, s.buffer); } Q : What is the output of the printf statement in the following code snippet if it is compiled as part of a C program? What if it's part of a C++ program? void f() { int x; x = 5; g(x); printf("x = %d\n", x); } A : if it's a 'C' program, the printf function will always print x = 5 if it's a 'C++' program, there's a possibility that the g(x) function takes x as a reference and change the value of x. So, the x value may differ in the printf function Q : Read and explain the following code: class X { int n; char *pChar; public: X(); X(int a = 0); }; void f() { X x; x.n = 4; } A : it has 2 errors. The constructors will lead to ambiguity. And x.n is not accessible because n is private member data. Q : Implement a constructor for this class which initializes the member variable n with the value passed as a. A : x(int a){ n = a;} Q : How would you initialize n with a if n were declared const? A : x(int a) : n(a) { } Q : If n is a static, non-const member of class X, how would you initialize it? A : int X :: n = 10; Q : Assuming that the constructor also allocates memory for pChar, what problems might arise from using this class? How would you eliminate these problems? A : When the object is destroyed, the memory allocated for that does not get released. So, we can write a destructor as X :: ~X() { delete[] pChar;} Q : What is the output from this program? #include class Base { public: Base() { vf(); } ~Base() { vf(); } virtual void vf() { cout << "Base::vf()" << endl; } }; class Derived : public Base { public: Derived() { }; ~Derived() { }; virtual void vf() { cout << "Derived::vf()" << endl; } }; void main() { Base* pb = new Derived; pb->vf(); delete pb; } A : the output is Base::vf() Derived::vf() Base::vf() Q : What problems if any do you see in the following code fragment? (Assume that X is some user-defined class and that E is some user-defined class used to encapsulate the details of error conditions. GetChunk is some utility function which should normally return a non-NULL pointer.) void f() { try { g(); } catch(E e) { cerr << e.text << endl; } } void g() { X* pX = new X; h(pX); delete pX; } void h(X* pX) { // ... if( GetChunk() == NULL ) throw E("No chunk available"); // ... } A : No problem is perceived Q : What is the output of the following program? #include void main() { int i = 5; int j = 4; int& r1 = i; int& r2 = j; int* p1 = &r1; int* p2 = &r2; *p1 = 3; *p2 = 2; cout << "i = " << i << endl; cout << "j = " << j << endl; r1 = r2; p2 = &r1; *p2 = 1; cout << "i = " << i << endl; cout << "j = " << j << endl; } A : the output is i = 3 j = 2 i = 1 j = 2 Q : What's the output of the following program? #include class X { public: X(char* s) { cout << s << endl; } }; class Y : public X { X a; X b; public: Y() : b("b"), a("a"), X("base") {} }; void main() { Y y; } A : the output is base a b Q : Will this work? void X::SwitchMe(X* anotherX) { this = anotherX; } A : it should not work. Q : CODEGEN.C int globalint; void function(int i) { return i+1; } void main() { globalint = function(1); } A : there will be a compile time error for this program. Because the return value of function is void which cannot be assigned to globalint. GENERIC.C #include "windows.h" #include "generic.h" HANDLE hInst; int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow) HANDLE hInstance; HANDLE hPrevInstance; LPSTR lpCmdLine; int nCmdShow; { MSG msg; if (!hPrevInstance) if (!InitApplication(hInstance)) return (FALSE); if (!InitInstance(hInstance, nCmdShow)) return (FALSE); while (GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); } BOOL InitApplication(hInstance) HANDLE hInstance; { WNDCLASS wc; wc.style = NULL; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "GenericMenu"; wc.lpszClassName = "GenericWClass"; return (RegisterClass(&wc)); } BOOL InitInstance(hInstance, nCmdShow) HANDLE hInstance; int nCmdShow; { HWND hWnd; hInst = hInstance; hWnd = CreateWindow( "GenericWClass", "Generic Sample Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if (!hWnd) return (FALSE); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return (TRUE); } long FAR PASCAL MainWndProc(hWnd, message, wParam, lParam) HWND hWnd; UINT message; WPARAM wParam; LPARAM lParam; { FARPROC lpProcAbout; switch (message) { case WM_COMMAND: if (wParam == IDM_ABOUT) { lpProcAbout = MakeProcInstance(About, hInst); DialogBox(hInst, "AboutBox", hWnd, lpProcAbout); FreeProcInstance(lpProcAbout); break; } else return(DefWindowProc(hWnd,message,wParam,lParam)); case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd,message, wParam, lParam)); } return (NULL); } BOOL FAR PASCAL About(hDlg, message, wParam, lParam) HWND hDlg; unsigned message; WORD wParam; LONG lParam; { switch (message) { case WM_INITDIALOG: return (TRUE); case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return (FALSE); }