Search code examples
cgccprintfassignment-operator

issue with assignment operator inside printf()


Here is the code

int main()
{
  int x=15;
  printf("%d %d %d %d",x=1,x<20,x*1,x>10);
  return 0;
}

And output is 1 1 1 1

I was expecting 1 1 15 1 as output,

x*1 equals to 15 but here x*1 is 1 , Why ? Using assignment operator or modifying value inside printf() results in undefined behaviour?


Solution

  • Your code produces undefined behavior. Function argument evaluations are not sequenced relative to each other. Which means that modifying access to x in x=1 is not sequenced with relation to other accesses, like the one in x*1. The behavior is undefined.

    Once again, it is undefined not because you "used assignment operator or modifying value inside printf()", but because you made a modifying access to variable that was not sequenced with relation to other accesses to the same variable. This code

    (x = 1) + x * 1
    

    also has undefined behavior for the very same reason, even though there's no printf in it. Meanwhile, this code

    int x, y;
    printf("%d %d", x = 1, y = 5);
    

    is perfectly fine, even though it "uses assignment operator or modifying value inside printf()".