C
В C, i = i+1
и i += 1
не эквивалентны, если i
является типом atomi c, потому что составное присваивание - чтение-изменение-запись работа с семантикой memory_order_seq_cst
, согласно C 2018 6.5.16.2 3. Я также не могу сказать, что стандарт C полностью ясен в отношении семантики i = i+1
и i += 1
в отношении летучих объектов. В противном случае ++i
, i = i+1
и i += 1
эквивалентны, учитывая, что i
является просто идентификатором, а не заполнителем для любого более сложного выражения.
C ++
In C ++, операции не эквивалентны. Доказательство:
Эта программа:
#include <iostream>
class SensitiveToOperations
{
public:
SensitiveToOperations operator ++() { std::cout << "Preincrement.\n"; return *this; }
SensitiveToOperations operator +(int that) const { std::cout << "Addition.\n"; return *this; }
SensitiveToOperations operator =(SensitiveToOperations that) { std::cout << "Assignment.\n"; return *this; }
SensitiveToOperations operator +=(int that) { std::cout << "AdditionAssignment.\n"; return *this; }
};
int main(void)
{
SensitiveToOperations i;
++i;
i = i + 1;
i += 1;
}
производит такой вывод:
Preincrement.
Addition.
Assignment.
AdditionAssignment.
, таким образом показывая, что для разных операций могут быть получены разные результаты.
Для фундаментальных типов операции могут быть в значительной степени эквивалентны, но я не квалифицирован, чтобы говорить с семантикой C ++ в отношении atomi c или volatile.