C 测试题(答案)

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 = '
登录后才可评论.