Anyho, it really depends on what your -W level is set to. It's good practice to use "-Wall"
However, a compound conditional can actually be more clear if the assignment is there in many cases. For example:
if ( (elt = db.getNextResult) && elt.shouldProcess){
... ...
}
In a compound conditional, the assignment is forced to be wrapped in parenthesis, so the ambiguity doesn't exist.Anyho, that's that.
except where noted [e.g. special rules for && and ||], the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is Unspecified.
This is basic stuff Chris, let's not debate the obvious, this kind of code is all over the place in the Linux kernel.
* http://linux-kernel.2935.n7.nabble.com/PATCH-drivers-net-ifb...
* http://linux-kernel.2935.n7.nabble.com/PATCH-1-4-silicom-che...
* http://linux-kernel.2935.n7.nabble.com/PATCH-0-4-Staging-sil...
Not to mention, checkpatch.pl checks for assignments in if statements:
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...
I should point out that someone tried to add a backdoor into the Linux kernel source through the use of an assignment in an if statement in 2004. What are your thoughts on this?
https://freedom-to-tinker.com/blog/felten/the-linux-backdoor...
Also, where is the place in the C99 standard that details the exception? Genuinely curious. When I reviewed the standard, all that is said about the if statement is in section 6.8.4.1, and that says nothing about short circuited logic, certainly nothing about "exceptions to the rule". This seems compiler specific, but I'm happy to be shown to be wrong - if you can point me to the part in the standard.
The construct is a useful idiom, but oftentimes there would be or ought to be a local coding standard recommending that you make what you're doing explicit by comparing the assignment result to the appropriate flavour of zero:
if ((foo = bar) != NULL)
Now everybody can see what's going on, the warning doesn't arise, and no pedants can complain about the theoretically-unnecesary parentheses in `if ((foo = bar))`.In my case, at least one of the compilers in question was for the 8051, the platform that won't fucking die. Due to the peculiarities of the aforementioned piece of silicon crap, the compiler was not entirely ANSI-compliant (various #pragmas were actually required to produce working code, indicating various parameters related to memory organisation and the such), thus making it rather difficult to compile the codebase with anything but that particular compiler.
> The construct is a useful idiom, but oftentimes there would be or ought to be a local coding standard recommending that you make what you're doing explicit by comparing the assignment result to the appropriate flavour of zero
This is the solution I adhere to as well.