Search code examples
coperator-precedencepointer-arithmetic

What does *--a = *--b mean in C


Suppose a and b are pointers,

My understanding is *--a = *--b means subtract 1 from a and b using pointer arithmetic, then dereference a and b and set them equal.

Is this equivalent to

--a;
--b;
*a=*b

Similarly, what is

*a++ = *b++;

equivalent to?


Solution

  • *––a = *––b 
    

    is logically equivalent to

    tmpa = a - 1
    tmpb = b - 1
    *tmpa = *tmpb
    a = a - 1
    b = b - 1
    

    with the caveat that the updates to a, b, and *tmpa can occur in any order, and those updates can even be interleaved. It’s also possible for the implementation to skip the temporaries and update the pointer values immediately:

    a = a - 1
    b = b - 1
    *a = *b
    

    but that’s not required or guaranteed. Similarly,

    *a++ = *b++
    

    is logically equivalent to

    tmpa = a
    tmpb = b
    *tmpa = *tmpb
    a = a + 1
    b = b + 1
    

    with the same caveats about the ordering of the updates to a, b, and *tmpa. Again, the implementation may skip using temporaries and evaluate it as

    *a = *b
    a = a + 1
    b = b + 1
    

    but again that’s neither required nor guaranteed.