'Inability to understand the output of a c program
I have come across a c program in a interview question .The program is as follow:
#include<stdio.h>
#define x 9+2/4*3-2*4+(5-4)*3
void main()
{
int i,y,p;
y=6+3*3/5;
printf("%d",x);
i=x*x+y;
printf("%d",i);
}
The output of this program is 30.But I can't understand how the program produce 30.Can anyone explain ?
Solution 1:[1]
#define, in your specific case, does simple text replacement.
First expression (for x) is
9+2/4*3-2*4+(5-4)*3
9+ 0 *3-2*4+ 1 *3
9+ 0 - 8 + 3
9 - 8 + 3
1 + 3
4
Second expression (for i) is
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3+y // y is 7
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3+7 // doing parenthesis
9+2/4*3-2*4+ 1 *3*9+2/4*3-2*4+ 1 *3+7 // doing multiplications and divisions
9+ 0 *3- 8 + 3 *9+ 0 *3- 8 + 3 +7 // doing multiplications and divisions again
9+ 0 - 8 + 27 + 0 - 8 + 3 +7 // doing addition and subtraction left to right
9 - 8 + 27 + 0 - 8 + 3 +7
1 + 27 + 0 - 8 + 3 +7
28 + 0 - 8 + 3 +7
28 - 8 + 3 +7
20 + 3 +7
23 +7
30
When writing #defines with operations always enclose the whole thing inside an extra set parenthesis:
#define x (9+2/4*3-2*4+(5-4)*3)
Solution 2:[2]
Integer division is part of the answer, but the trickier part is the #define. Many people assume that a #define is evaluated when it is defined, but it is really just a simple text substitution. So when you are given x*x, you get
9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)*3
Note that is the middle of this you have 3*9, which you would not get if you assumed x was a simple numeric value. Heres the whole process:
x * x
= 9+2/4*3-2*4+(5-4)*3*9+2/4*3-2*4+(5-4)
= 9 + 0 - 8 + 27 + 0 - 8 + 3
= 1 + 27 - 5
= 23
Then, since y=7, 23 + 7 = 30
Voila
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | pmg |
| Solution 2 | SGeorgiades |
