
Scott Wood scottwood@freescale.com writes:
On 01/21/2013 04:36:42 PM, Måns Rullgård wrote:
Scott Wood scottwood@freescale.com writes:
On 01/19/2013 03:30:30 AM, Albert ARIBAUD wrote:
/* what I favor */ clk_is_enabled = ((reg_val >> 9) & 1) ? true: false; ip_is_enabled = clk_is_enabled && pwd_is_enabled; if (clk_is_enabled) { ...
rather than assigning them 'zero/nonzero', or using bitwise ops on booleans, or testing against boolean constants (although I concede that the first line below wins over its counterpart above as far as concision is concerned).
Conciseness can be improved with "!!((reg_val >> 9) & 1)".
x & 1 is already either zero or one. Any further operations are nothing but obfuscation.
The point is to avoid depending on the actual integer values of the boolean type,
Boolean expressions are defined to have a value of zero or one, and the _Bool type (may it burn in hell) must be able to represent those values.
and make the code more robust against changes (e.g. someone later comes along and says "hmm, that 1 should be a 3 because we care about that other register bit as well" without noticing that it's being assigned to a boolean.
If you stayed away from the silly _Bool type that wouldn't be a problem, as long as any uses of the value treat all non-zero values equally, i.e. only use it in a boolean context and not compare against explicit values or perform arithmetic or bitwise logic operations on it.
In other words, boolifying on use rather than on assignment is generally safer and usually at least as efficient.