On 2016.12.08 at 12:17 +0000, Jonathan Wakely wrote: > On 8 December 2016 at 11:46, lhmouse wrote: > >> On 8 December 2016 at 07:13, lhmouse wrote: > >>> It is undefined behavior. > >>> > >>> The evaluation of three parameters in question is (at the moment) unsequenced. > >>> Since each of them contains a function call, the three function calls are also > >>> unsequenced. The modify-and-read operations inside the function calls are > >>> unsequenced relative to each other. Hence the UB. > >> > >> No, that's incorrect. The functions don't interleave. It's unspecified > >> which order they execute in, but there is no undefined behaviour. > > I did ask a similar question on ##c++ on freenode and it seemed that people couldn't > > agree with each other. There were even opinions suggesting 'unspecified' be replaced > > with 'undefined' because it could be hard to distinguish it from the other. > > No comment. > > > Personally I think his code is UB because `printf` is a library function call hence > > is considered a 'side effect'. In spite that function calls don't interleave, changes of > > order of evaluation could produce different side effects and the result is undefined. > > No, the result is unspecified. That's very different from undefined, > whatever some people on IRC might say. > > The standard is clear that each invocation of the function body > completes before the next invocation begins. If http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0431r0.htm make it into C++17, then the sequence would be left-to-right. -- Markus