Monday 9 January 2012

Various Preprocessor Question

(1) What will be output of following code?

#include<stdio.h>
#define max 10
int main(){
    int i;
    i=++max;
    printf("%d",i);
    return 0;
}

(2) What will be output of following code?

#include<stdio.h>
#define max 10+2
int main(){
    int i;
    i=max*max;
    printf("%d",i);
    return 0;
}

(3) What will be output of following code?

#include<stdio.h>
#define A 4-2
#define B 3-1
int main(){
     int ratio=A/B;
     printf("%d ",ratio);
     return 0;
}

(4) What will be output of following code?

#include<stdio.h>
#define MAN(x,y) (x)>(y)?(x):(y)
int main(){
       int i=10,j=9,k=0;
       k=MAN(i++,++j);
       printf("%d %d %d",i,j,k);
       return 0;
}

(5) What will be output of following code?

#include<stdio.h>
#define START main() {
#define PRINT printf("*******");
#define END }
START
PRINT
END

(6) What will be output of following code?

#define CUBE(x) (x*x*x)
#define M 5
#define N M+1
#define PRINT printf("RITESH");
int main(){
      int volume =CUBE(3+2);
      printf("%d %d ",volume,N);
      PRINT
      return 0;
}

Solution section 

(1)output: compiler error.
Explanation:

Here max is preprocessor macro symbol which process first before the actual compilation. First preprocessor replace the symbol to its value in entire the program before the compilation. So in this program max will be replaced by 10 before compilation. Thus program will be converted like this:

int main(){
     int i;
     i=++10;
     printf("%d",i);
     return 0;
}

In this program we are trying to increment a constant symbol.

Meaning of ++10 is:
10=10+1
or 10=11

Which is error because we cannot assign constant value to another constant value .Hence compiler will give error.

(2)

Output: 32
Explanation:

Here max is preprocessor macro symbol which process first before the actual compilation start. Preprocessor replace the symbol to its value in entire the program before the compilation. So in this program max will be replaced by 10+2 before compilation. Thus program will be converted as:
 
int main(){
    int i;
    i=10+2*10+2;
    printf("%d",i);
    return 0;
}

now i=10+2*10+2
i=10+20+2
i=32

(3)

Output: 3
Explanation:

A and B are preprocessor macro symbol which process first before the actual compilation start. Preprocessor replace the symbol to its value in entire the program before the compilation. So in this program A and B will be replaced by 4-2 and 3-1 respectively before compilation. Thus program will be converted as: 

int main(){
    int ratio=4-2/3-1;
    printf("%d ",ratio);
    return 0;
}

Here ratio=4-2/3-1
ratio=4-0-1
ratio=3

(4)

Output: 11 11 11

Explanation:

Preprocessor’s macro which process first before the actual compilation. Thus program will be converted as: 

int main(){
    int i=10,j=9,k=0;
    k=(i++)>(++j)?(i++):(++j);
    printf("%d %d %d",i,j,k);
    return 0;
}

now k=(i++)>(++j)?(i++):(++j);
first it will check the condition
(i++)>(++j)

i++ i.e. when postfix is used with variable in expression then expression is evaluated first with original value then variable is incremented

Or 10>10

This condition is false.
Now i = 10+1 = 11
There is rule, only false part will execute after? i.e. ++j, i++ will be not execute.
So after ++j
j=10+1=11;

And k will assign value of j .so k=11; 

(5)

Output: *******
Explanation:
This program will be converted as: 

main(){
    printf("*******");
}

(6)

Output: 17 6
Explanation: This program will be converted as:

int main(){
    int volume =(3+2*3+2*3+2);
    printf("%d %d ",volume,5+1);
    PRINT
    return 0;
}

No comments:

Post a Comment