C Interview Questions

void main()
{
      int k=1;
      printf("%d==1 is ""%s",k,k==1?"TRUE":"FALSE");
}

Answer:
     1==1 is TRUE
Explanation:
     When two strings are placed together (or separated by white-space) they are concatenated (this is called as "stringization" operation). So the string is as if it is given as "%d==1 is %s". The conditional operator( ?: ) evaluates to "TRUE".

main()
{
     int y;
     scanf("%d",&y); // input given is 2000
     if( (y%4==0 && y%100 != 0) || y%100 == 0 )
          printf("%d is a leap year");
     else
          printf("%d is not a leap year");
}

Answer:
     2000 is a leap year
Explanation:
     An ordinary program to check if leap year or not.

#define max 5
#define int arr1[max]
main()
{
     typedef char arr2[max];
     arr1 list={0,1,2,3,4};
     arr2 name="name";
     printf("%d %s",list[0],name);
}

Answer:
     Compiler error (in the line arr1 list = {0,1,2,3,4})
Explanation:
     arr2 is declared of type array of size 5 of characters. So it can be used to declare the variable name of the type arr2. But it is not the case of arr1. Hence an error.
Rule of Thumb:
     #defines are used for textual replacement whereas typedefs are used for declaring new types.

int i=10;
main()
{
     extern int i;
     {
          int i=20;
          {
               const volatile unsigned i=30;
               printf("%d",i);
          }
          printf("%d",i);
     }
     printf("%d",i);
}

Answer:
     30,20,10
Explanation:
     '{' introduces new block and thus new scope. In the innermost block i is declared as,
          const volatile unsigned
     which is a valid declaration. i is assumed of type int. So printf prints 30. In the next block, i has value 20 and so printf prints 20. In the outermost block, i is declared as extern, so no storage space is allocated for it. After compilation is over the linker resolves it to global variable i (since it is the only variable visible there). So it prints i's value as 10.

main()
{
     int *j;
     {
          int i=10;
          j=&i;
     }
     printf("%d",*j);
}

Answer:
     10
Explanation:
     The variable i is a block level variable and the visibility is inside that block only. But the lifetime of i is lifetime of the function so it lives upto the exit of main function. Since the i is still allocated space, *j prints the value stored in i since j points i.

main()
{
      int i=-1;
      -i;
      printf("i = %d, -i = %d \n",i,-i);
}

Answer:
     i = -1, -i = 1
Explanation:
     -i is executed and this execution doesn't affect the value of i. In printf first you just print the value of i. After that the value of the expression -i = -(-1) is printed.

#include
main()
{
      const int i=4;
      float j;
      j = ++i;
      printf("%d %f", i,++j);
}

Answer:
     Compiler error
Explanation:
     i is a constant. you cannot change the value of constant

#include
main()
{
       int a[2][2][2] = { {10,2,3,4}, {5,6,7,8} };
       int *p,*q;
       p=&a[2][2][2];
       *q=***a;
       printf("%d..%d",*p,*q);
}

Answer:
     garbagevalue..1
Explanation:
     p=&a[2][2][2] you declare only two 2D arrays. but you are trying to access the third 2D(which you are not declared) it will print garbage values. *q=***a starting address of a is assigned integer pointer. now q is pointing to starting address of a.if you print *q meAnswer:it will print first element of 3D array.

#include
main()
{
       register i=5;
       char j[]= "hello";
       printf("%s %d",j,i);
}

Answer:
     hello 5
Explanation:
     if you declare i as register compiler will treat it as ordinary integer and it will take integer value. i value may be stored either in register or in memory.

main()
{
       int i=5,j=6,z;
       printf("%d",i+++j);
}

Answer:
     11
Explanation:
     the expression i+++j is treated as (i++ + j)

Google