c - Macro Substitution assignment -


#define max(x,y)(x)>(y)?(x):(y) main() {     int i=10,j=5,k=0;     k==max(i++,++j);     printf("%d %d %d",i,j,k);//11 7 0 } 

why output 11 7 0 instead of 11 6 0?

the statement expands to

k==(i++)>(++j)?(i++):(++j) 

let's re-write added parens emphasise how expression parsed when accounting precedence rules:

( k == ( (i++) > (++j) ) ) ? (i++) : (++j) 

note > has higher precedence ==.

now, (i++) > (++j) evaluated first, evaluates 1 , both i , j incremented. k compared equality 1 , yields 0. conditional operator evaluates (++j) , j incremented 1 more time.

in total i incremented once, j incremented twice , k not modified. , hence output describe.

this example of perils of using macros. function need.

some other points:

  1. your main declared incorrectly. should int main(void).
  2. if compile warnings enabled compiler flag line in question. compiler says:
 c:\users\blah\desktop>gcc main.c -wall -o main.exe main.c: in function 'main': main.c:2:20: warning: suggest parentheses around comparison in operand of '==' [-wparentheses]  #define max(x,y)(x)>(y)?(x):(y)                     ^ main.c:6:8: note: in expansion of macro 'max'      k==max(i++,++j);         ^ 

Comments

Popular posts from this blog

ruby - Trying to change last to "x"s to 23 -

jquery - Clone last and append item to closest class -

c - Unrecognised emulation mode: elf_i386 on MinGW32 -