On Fri, May 5, 2023 at 11:49 AM Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> wrote: > > I would add to this list of exceptions cases where the argument is used > as an expression within brackets, e.g. > > #define m(x) myvar[x] Yeah, that makes sense not because of any operator precedence rules, but simply because brackets end up syntactically nesting just like parentheses themselves do. IOW, while you can mess up that nesting by having non-nested brackets in the argument, that's equally true of any added parentheses too. > The other exception I would add is when a parameter is used as an > lvalue, as: > > #define m(x) do { x = 2; } while (0) I really don't understand why you think '=' is so special. It's very much not special. It happens to have the lowest precedence, sure, but the keyword is "happens". I think you are confused by the non-C languages that make assignment be not an expression operator, but a statement. So I think you are technically correct in that the parentheses aren't _needed_, but the above is still the same case that in many other situations parentheses aren't technically *needed*, but not having to think about it is better than having to do so. Linus