Просто попробуйте x += 1; x %= 10;
как альтернативу, она будет работать, но она не эквивалентна первому выражению.Вы не можете обернуть оба в одно выражение [1], так как
x op= expression;
означает
x = x op (expression); /* look at the parenthesis */
, и это сначала вызывает оценку выражения.Единственный случай, когда
x = (x op1 a) op2 b;
может быть преобразован в операцию операционного присваивания, - это если операторы являются ассоциативными, а выражение может быть преобразовано в:
x = x op1 (a op2 b);
(или если op2
имеет более высокий приоритет, чем op1
, что означает, что порядок оценки такой же, как указано выше), и тогда будет возможно
x op1= a op2 b;
.
Примеры
x = x + a + b; ==> x += a + b; /* this implies a different order of evaluation */
x = x + a * b; ==> x += a * b;
x = x + a % b; ==> x += a % b; /* % has higher precedence than + */
Примечание [1]: хорошо, вы можете, но с помощью другого оператора, оператора ,
, вы можете преобразовать его в x += 1, x %= 10;