C Programming Puzzlers

These questions originally appeared as an article on programmersheaven.com, written by Ashok K. Pathak, a researcher at Bharat Electronics Limited (CRL), Ghaziabad.  They are reproduced here with minor modifications.

The questions test advanced knowledge of the C language, including some rarely-used features.  Effective C programming requires a strong understanding of concepts like undefined behavior, recursion, and pointer arithmetic, but the deliberately convoluted examples on this page are not representative of real-world code, and certainly won't win any prizes for clarity and maintainability.

Performance on these questions is not a good indicator of broader competence in software development.  As such, they are unlikely to be useful in an interview setting.

Steve Kobes, 8/25/04 (amended 6/19/11)

Jump to question: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1. Consider the following program:

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

int main(void){
   volatile int b = 3;

   if (setjmp(buf) != 0)
   {
      printf("%d\n", b);
      exit(0);
   }
   b = 5;
   longjmp(buf, 1);
}

What is the output of this program?

(a)     3
(b)  5
(c)     0
(d)     none of the above

Show answer

2. Consider the following program:

#include <stdio.h>

int main(void){
   struct node
   {
      int a;
      int b;
      int c;
   };
   struct node s = { 3, 5, 6 };
   struct node *pt = &s;

   printf("%d\n", *(int*)pt);

   return 0;
}

What is the output of this program?

(a)  3
(b)     5
(c)     6
(d)     7

Show answer

3. Consider the following code segment:

int foo(int x, int n){
   int val = 1;

   if (n > 0)
   {
      if (n % 2 == 1)
         val *= x;

      val *= foo(x * x, n / 2);
   }
   return val;
}

What function of x and n is computed by foo?

(a)  xn
(b)     x   ×   n
(c)     nx
(d)     none of the above

Show answer

4. Consider the following program:

#include <stdio.h>

int main(void){
   int a[5] = { 1, 2, 3, 4, 5 };
   int *ptr = (int*)(&a + 1);

   printf("%d %d\n", *(a + 1), *(ptr - 1));

   return 0;
}

What is the output of this program?

(a)     2 2
(b)     2 1
(c)  2 5
(d)     none of the above

Show answer

5. Consider the following program:

#include <stdio.h>

void foo(int[][3]);

int main(void){
   int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

   foo(a);
   printf("%d\n", a[2][1]);

   return 0;
}

void foo(int b[][3]){
   ++b;
   b[1][1] = 9;
}

What is the output of this program?

(a)     8
(b)  9
(c)     7
(d)     none of the above

Show answer

6. Consider the following program:

#include <stdio.h>

int main(void){
   int a, b, c, d;
   a = 3;
   b = 5;
   c = a, b;
   d = (a, b);

   printf("c=%d ", c);
   printf("d=%d\n", d);

   return 0;
}

What is the output of this program?

(a)     c=3 d=3
(b)     c=5 d=3
(c)  c=3 d=5
(d)     c=5 d=5

Show answer

7. Consider the following program:

#include <stdio.h>

int main(void){
   int a[][3] = {1, 2, 3, 4, 5, 6};
   int (*ptr)[3] = a;

   printf("%d %d ", (*ptr)[1], (*ptr)[2]);

   ++ptr;
   printf("%d %d\n", (*ptr)[1], (*ptr)[2]);

   return 0;
}

What is the output of this program?

(a)  2 3 5 6
(b)     2 3 4 5
(c)     4 5 0 0
(d)     none of the above

Show answer

8. Consider the following code segment:

#include <stdlib.h>

int *f1(void){
   int x = 10;
   return &x;
}

int *f2(void){
   int *ptr;
   *ptr = 10;
   return ptr;
}

int *f3(void){
   int *ptr;
   ptr = malloc(sizeof *ptr);
   return ptr;
}

Which of these functions uses pointers incorrectly?

(a)     f3   only
(b)     f1   and   f3
(c)  f1 and f2
(d)     f1 ,   f2 , and   f3

Show answer

9. Consider the following program:

#include <stdio.h>

int main(void){
   int i = 3;
   int j;

   j = sizeof(++i + ++i);

   printf("i=%d j=%d\n", i, j);

   return 0;
}

What is the output of this program on an implementation where int occupies 2 bytes?

(a)     i=4 j=2
(b)  i=3 j=2
(c)     i=5 j=2
(d)     the behavior is undefined

Show answer

10. Consider the following program:

#include <stdio.h>

void f1(int*, int);
void f2(int*, int);
void (*p[2])(int*, int);

int main(void){
   int a = 3;
   int b = 5;

   p[0] = f1;
   p[1] = f2;

   p[0](&a, b);
   printf("%d %d ", a, b);

   p[1](&a, b);
   printf("%d %d\n", a, b);

   return 0;
}

void f1(int *p, int q){
   int tmp = *p;
   *p = q;
   q = tmp;
}

void f2(int *p, int q){
   int tmp = *p;
   *p = q;
   q = tmp;
}

What is the output of this program?

(a)  5 5 5 5
(b)     3 5 3 5
(c)     5 3 3 5
(d)     none of the above

Show answer

11. Consider the following program:

#include <stdio.h>

void e(int);

int main(void){
   int a = 3;
   e(a);

   putchar('\n');
   return 0;
}

void e(int n){
   if (n > 0)
   {
      e(--n);
      printf("%d ", n);
      e(--n);
   }
}

What is the output of this program?

(a)  0 1 2 0
(b)     0 1 2 1
(c)     1 2 0 1
(d)     0 2 1 1

Show answer

12. Consider the following code segment:

typedef int (*test)(float*, float*);
test tmp;

What is the type of tmp?

(a)     function taking two pointer-to- float   arguments and returning pointer to   int
(b)     pointer to   int
(c)  pointer to function taking two pointer-to-float arguments and returning int
(d)     none of the above

Show answer

13. Consider the following program:

#include <stdio.h>

int main(void){
   char p;
   char buf[10] = {1, 2, 3, 4, 5, 6, 9, 8};

   p = (buf + 1)[5];
   printf("%d\n", p);

   return 0;
}

What is the output of this program?

(a)     5
(b)     6
(c)  9
(d)     none of the above

Show answer

14. Consider the following program:

#include <stdio.h>

void f(char**);

int main(void){
   char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
   f(argv);

   return 0;
}

void f(char **p){
   char *t;

   t = (p += sizeof(int))[-1];

   printf("%s\n", t);
}

What is the output of this program on an implementation where int and all pointer types occupy 2 bytes?

(a)     ab
(b)     cd
(c)     ef
(d)  gh

Show answer

15. Consider the following program:

#include <stdarg.h>
#include <stdio.h>

int ripple(int n, ...){
   int i, j, k;
   va_list p;

   k = 0;
   j = 1;
   va_start(p, n);

   for (; j < n; ++j)
   {
      i = va_arg(p, int);
      for (; i; i &= i - 1)
         ++k;
   }
   va_end(p);
   return k;
}

int main(void){
   printf("%d\n", ripple(3, 5, 7));
   return 0;
}

What is the output of this program?

(a)     7
(b)     6
(c)  5
(d)     3

Show answer

16. Consider the following program:

#include <stdio.h>

int counter(int i){
   static int count = 0;
   count = count + i;
   return count;
}

int main(void){
   int i, j;

   for (i = 0; i <= 5; i++)
      j = counter(i);

   printf("%d\n", j);
   return 0;
}

What is the output of this program?

(a)     10
(b)  15
(c)     6
(d)     7

你可能感兴趣的:(C语言面试题)