Assignments within sub-expressions are hard to spot and therefore make the code less readable.
It is also a common mistake to write = when == was meant.
Ideally, sub-expressions should not have side-effects.
Noncompliant Code Example
doSomething(i = 42);
Compliant Solution
i = 42;
doSomething(i);
// or
doSomething(i == 42); // Perhaps in fact the comparison operator was expected
Exceptions
Assignments in while statement conditions, and assignments enclosed in relational expressions are allowed.
while ((line = nextLine()) != null) {...} // Compliant
while (line = nextLine()) {...} // Compliant
if (line = nextLine()) {...} // Noncompliant
See
- MISRA C:2004, 13.1 - Assignment operators shall not be used in expressions that yield a Boolean value
- MISRA C++:2008, 6-2-1 - Assignment operators shall not be used in sub-expressions
- MISRA C:2012, 13.4 - The result of an assignment operator should not be used
- MITRE, CWE-481 - Assigning instead of Comparing
- CERT, EXP45-C. - Do not perform assignments in selection statements
- CERT, EXP51-J. - Do not perform assignments in conditional expressions
- CERT, EXP19-CPP. - Do not perform assignments in conditional expressions
- CERT, MSC02-CPP. - Avoid errors of omission