* = это отдельный оператор.Для всех встроенных функций он делает то же самое, что и умножение и присваивание, и если вы когда-либо определяете его для одного из ваших собственных классов, вы действительно ДОЛЖНЫ заставить его делать то же самое по очевидным причинам.Тем не менее, вы бы НЕ ДОЛЖНЫ.
То есть * = - это свой собственный оператор со своим собственным приоритетом, и внутри он будет представлен как «умножение, затем присвоение», но ни в коем случае не являетсяСтрока, когда-либо повторно анализируемая с помощью операторов умножения и присваивания в.
Учитывая это, существует два способа, которыми можно проанализировать строку:
- Как a * = (b + c) (должен иметь тот же результат, что и a = a * (b + c) для любых нормальных типов)
- As (a * = b) + c (что при условии, что этоавтономный оператор, умножит a на b, присвоит результат a. Затем он умножит новое значение на c, но отбросит результат)
Таким образом, выможно видеть, что нет прецедента, который заставил бы его делать «a = (a * b) + c», чего вы и боялись.
На самом деле, второе явно не очень полезно, и по этой причине,все операторы присваивания и что-то присваивания имеют более низкий приоритет, чем арифметические и другие «нормальные» операции, фактически, более низкий приоритет, чем что-либо, кроме «,».
Легко проверить приоритет, найдя таблицу, например:
http://www.cppreference.com/wiki/language/operator_precedence
Я не помнювсе детали, так что хорошо проверить, если вы не уверены между похожими операторами, но вы можете сделать большую часть этого, помня общие принципы, подобные этому.