Ugh, this is why allowing assignment in any context other than an isolated variable = value; statement is a horrible idea and should never have been allowed out of the first draft of C.
Kinda surprised this is undefined behaviour, though. As far as I can see from reading various tables, the = used for assignment is placed way down in the order of evaluation/precedence of operators, just above the comma (another silly idea that should have been left out), and parallel assignments are processed from right to left. with the aid of brackets forcing things forward, we should get:
sum = left + (right = (left = next_word) - diff);
becoming
left = next_word;
right = left - diff;
sum = left + right;
and
sum = (left = diff + (right = next_word)) + right;
becoming
right = next_word;
left = diff + right;
sum = left + right;
Either way, the original compound statements look horrible and obfuscate understanding. If some compilers disagree on how to interpret them, whether or not there is any theoretical ambiguity, I can happily take another excuse for everyone to avoid using embedded assignments!
Hands up: I kinda see the appeal of creating complicated, maximally crunched statements in a geeky way, sort of like a vastly reduced personal version of the IOCCC. But for any real project, especially if it were likely to be released, I would have to avoid them, and this is as much for my own ability to understand the code the next day as anything else! Creating technically baffling code can be a fun exercise, but it tends to mess things up down the line.