a ||= expr
is problematic due to short circuit evaluation of its equivalent a = a || expr
.
To have a ||= expr
function like a = a || expr
consider OP’s assertion:
“In the statement
a = a || expr
…, first both a and expr will be implicitly converted to “booleans”,”
This is not quite correct. expr
will not be converted if a
evaluates to true
. This would make a difference should expr
be something like scanf()
or rand()
or some function that affected the state of the program.
Code such as a ||= scanf("%d", &i) != 1;
would only attempt to scan data with a false value in a
. Although it would be possible to extend the language this way, additional short-circuit operators to the current set of ||
and &&
would likely cause more coding problems than clear simplifications.
On the other hand: A quick, if obfuscated, way to write code where functions return non-zero codes on error.
// Perform functions until an error occurs.
bool error = foo1();
error &&= foo2(); // Only valid if C was extended with &&=
error &&= foo3();