I have started studying about C++0x. I came across the follow expression somewhere:
int l = 1, m=2;
++l *= m;
I have no idea whether the second expression has well defined behavior or not. So I am asking it here.
Isn’t it UB? I am just eager to know.
In the code above, prefix++has precedence over*=, and so gets executed first. The result is thatlequals4.UPDATE: It is indeed undefined behavior. My assumption that precedence ruled was false.The reason is that
lis both an lvalue and rvalue in*=, and also in++. These two operations are not sequenced. Hencelis written (and read) twice “without a sequence point” (old standard wording), and behavior is undefined.As a sidenote, I presume your question stems from changes regarding sequence points in C++0x. C++0x has changed wording regarding “sequence points” to “sequenced before”, to make the standard clearer. To my knowledge, this does not change the behavior of C++.
UPDATE 2: It turns out there actually is a well defined sequencing as per sections 5.17(1), 5.17(7) and 5.3.2(1) of the N3126 draft for C++0x. @Johannes Schaub’s answer is correct, and documents the sequencing of the statement. Credit should of course go to his answer.