I would put parentheses here, I never like mixing logical operators with other types (or even different types of logical operators). While it's of course entirely redundant here, it also makes the code easier to read IMO.
I think the parent's point is more convincing: why make this check only for root in the first place?
Sure, my point was that even with the proper == comparison I'd still write the (now redundant) parens because I find it more readable that way.
Actually in languages like Rust with type inference that make it cheap and non-verbose to declare intermediate values I tend to avoid complicated conditions altogether, I could rewrite the provided expression like:
let invalid_options = (options == (__WCLONE|__WALL));
let is_root = (current->uid == 0);
if invalid_options && is_root {
// ...
}
One might argue that it's overkill but I find that it's more "self-documenting"
that way. I find that the more experienced I get, the most verbose my code
becomes. Maybe it's early onset dementia, or maybe it's realizing that it's
easier to write the code than to read it.
Of course you can do that in C as well but you have to declare the boolean
variables, and in general it's frowned upon to intermingle code and variable
declarations so you'd have to add them at the beginning of the function so it
adds boilerplate etc...
I think the parent's point is more convincing: why make this check only for root in the first place?