На каждом языке, который я видел, который поддерживает оператор + =, компилятор оценивает операнд с левой стороны один раз, чтобы получить некоторый тип адреса, который затем используется как для чтения старого значения, так и для записи новогоодин.Оператор + = - это не просто синтаксический сахар;как вы заметили, он может достичь семантики выражений, что было бы неудобно достигать с помощью других средств.
Кстати, операторы «With» в vb.net и Pascal оба имеют похожую функцию.Оператор наподобие:
' Assime Foo is an array of some type of structure, Bar is a function, and Boz is a variable.
With Foo(Bar(Boz))
.Fnord = 9
.Quack = 10
End With
вычислит адрес Foo (Bar (Boz)), а затем установит для двух полей этой структуры значения девять и десять.В C это будет эквивалентно
{
FOOTYPE *tmp = Foo(Bar(Boz));
tmp->Fnord = 9;
tmp->Quack = 10;
}
, но vb.net и Pascal не предоставляют временный указатель.Хотя можно добиться того же эффекта в VB.net без использования «С» для хранения результата Bar (), использование «С» позволяет избежать временной переменной.