1. Why (x=y)=z is illegal in C? A: Because x=y will create rvalue, we cannot assign a value to rvalue. 2. How to call C function in C++? A: Use extern "C" { func(); } because C and C++ have different signatures of functions, C++ uses mangling mechanism to deal with the function. 3. How to avoid multiple definition error in compiling time? in liking time? A: Use #ifndef something #define something ... #endif in header file to avoid the error in compiling time; Use extern somevariable to avoid the error in linking time. 4. What's generic pointer? What's generic function pointer? A: Generic pointer is void*; generic function pointer is void (*)(). 5. What's memory leak? A: Memory leak usually happens when using malloc (new in C++) to locate memory in heap, but do not use free (delete in C++) to free the memory. 6. Explain the following: (1) struct str *(*block())[8]; (2) double (*(*func)())[2][6]; A: (1) block is a function that return a pointer to an array of 8 pointers to structures of type str. (2) func is a pointer to a function that return a pointer to a 2 by 6 arrary of doubles. 7. Explain the following type names: (1) int *[3] (2) int (*)[3] A: (1) array of three pointers to int; (2) pointer to an array of three ints. 8. What's difference of type (signed) char and unsigned char? A: C states that char is both an integer type and a character type. When char is treated as an integer, (signed) char is between -127 and 127; and unsigned char is between 0 and 255. 9. What is the result in j? short s = 0xA000; unsigned long j; j = (unsigned long) s; A: j = 0xFFFFA000, because of sign extension. 10. How many keywords, how many precedences, how many operators, how many basic type conversions in C? A: 32 keywords, 15 precedences, 41 operators and 16 basic type conversions. 11. How many name spaces in C? A: 4 Name space of label, tag, struct or union member and ordinary identifier. 12. Is the following code legal? struct list { in x; struct list *list; } *list; fun(struct list *list) { list: printf("%dn", list->x); if ((list = list->list) != NULL) goto list; } A: Yes, because the lists belong to different name spaces. 13. What's is qualified type? A: Each (unqualified) type has three qualified versions of its type: volatile, constant, and both. 14. Explain int *const *const volatile *p; A: p is a pointer to a constant volatile pointer to a constant pointer to an integer. p and ***p can be changed, but *p and **p cannot, and *p may be changed by some external means because it is volatile. 15. Is the following code legal? char c[] = "abc"def"; A: It is legal. 16. Why we need to avoid int a; a = (-9)/5; A: Because C cannot guarantee that the integer truncating is correct; better to use function div(). 17. Why we need to avoid the code such as: y[i] = x[i++]; A: Because the order of evaluation of this expression is unspecified. 18. What's difference between sizeof and strlen()? A: sizeof is keyword which is evaluated and replaced by the size of the data element checked. When it is applied to a string, it tells us how large the string was originally defined to be. strlen() is a library function which tells us how many characters are currently in it. 19. How is the unsigned number 0xaabbccdd layed out in the little endian computer(such as PC)? In the big endian computer? A: In the little endian computer: aabbccdd (<- increasing addresses) In the big endian computer: ddccbbaa (<- increasing addresses) 20. In the code float *p, f[128]; p = f; p = p + 120; p is always pointing to f[120] independent on the machine? A: Yes. 21. In the code int a; a = 4 > 3; how many is a? A: a == 1. 22. In the code while(-1) { fun(); } Will fun() run forever? A: Yes. 23. Is the following code legal? struct { int x, y; } *p; struct { int x, y; } *q; main() { p = q; } A: No, because the compiler will create different temporary tags for the structures. 24. Is 123.4.5 a valid preprocessing number? A: Yes, it sometimes shows up in the code; but it is not a valid numeric constant. 25. What's the problem with the following macro definition: #define twice(x) (2*x) A: Should be #define twice(x) (2*(x)) Otherwise, i = twice(a+5)*3; will become i = (2*a+5)*3; 26. Is the following code legal? switch (n%4) { while (n>0) { case 0: *x++ = *y++; n--; case 3: *x++ = *y++; n--; case 2: *x++ = *y++; n--; case 1: *x++ = *y++; n--; } } A: Yes. Because any statement can follow the switch clause. 27. In the following, which one is legal? (1) static int x; extern int x; (2) extern int x; static int x; A: (1) is legal, and x has internal linkage. 28. What's the layout for 2-D arrays in the memory? A: C uses row-major storage order for arrays (FORTRAN uses column-major) float a[3][4] layout is a[0][0] a[0][1] . . 29. Is the following code legal? int b[100], p; for (p = b; p < &b[100]; p++) *p = 0; A: Yes, it is legal to address &b[100], but it is illegal to get the content of b[100]. 30. What's difference when reading a file using binary-mode or text-mode? A: In PC machine, reading a file using text-mode, we would get fewer than the number of requested characters. Because text-mode would change rn (in PC) to be n. The following questions are related to compiler design: 31. Returning the address of a local variable is a common programming error. Why the C compiler cannot catch such errors at compile-time? A: You can design a compiler to catch some of the above error, but cannot detect the all of the above error. For example, you cannot catch the errors in which the address of a local is first passed as the value of another variable. Here is a buggy function I have seen several times: char* toString(int n) { char buf[20], *p = buf + sizeof (buf); *--p = ' |