0

#define prn(a) printf("%d",a)
#define print(a,b,c) prn(a), prn(b), prn(c)
#define max(a,b) (a<b)? b:a

main()
{
int x=1, y=2;
print(max(x++,y),x,y);
print(max(x++,y),x,y);
}

output:222342

pls explain how we get output 342 at end

3
Contributors
2
Replies
4
Views
6 Years
Discussion Span
Last Post by lionaneesh
0

The result is undefined behavior because of the ++ operator. max() evaluates both variables a and b twice, so the ++ operator gets executed twice. Exactly what the final result will be is compiler implementation dependent. Your compiler may produce one value while another compiler may produce something else.

Edited by Ancient Dragon: n/a

0
#include<stdio.h>

#define prn(a) printf("%d",a)
#define print(a,b,c) prn(a), prn(b), prn(c)
#define max(a,b) (a<b)? b:a

int main()
{
	int x=1, y=2;
	printf("First Print Call :");
	print(max(x++,y),x,y);	// here x is incremented after the max call returns then value of x becomes 2(remember we used x++ not ++x so the max call 						wil recieve 1 as x's(a) value and 2 as y's value (b) so the output becomes prn(y),prn(x),prn(y) ....Therefore the 						output is 222
	printf("\n2nd print call : ");
	prn(max(x++,y));// Now here the value of x=2,y = 2 call =  max(x++,y) here a(x++) is not < b(y) therefore it returns a(x++ = x+1) the #define max statement increments x once in the call also the it returns x then x is incremented and we get 3 as output 
	prn(x);	
	prn(y);
	printf("\n");
}

Your code was not so impressive so i made some changes for better understanding..
a bit tricky part is here

prn(max(x++,y));

What max call does is that:-

#define max(a,b) (a<b)? b:a

So the max call here gets input 2 integers...x++ and y
as a is not less that b the max returns a which is x++
Here x increments one time...Its value becomes 3...

Now after the max call the x++ in the parenthesis increments now the value of x becomes 4...So the output 4...y's value is 2 so output=2

I hope you find it little bit easy now... Mess with your code ...Try with different variables and you'll get a better understanding of this....

Use code tags...or someone will vote you down...

Comments
thanks a ton u have cleared mine basic doubts
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.