Это глупый вопрос, но я в тупике. Являются ли следующие два оператора C++ идентичными?Оператор присваивания, идентичные заявления
regWages = regPay + overTime;
regPay + overTime = regWages;
Это глупый вопрос, но я в тупике. Являются ли следующие два оператора C++ идентичными?Оператор присваивания, идентичные заявления
regWages = regPay + overTime;
regPay + overTime = regWages;
Номер один действителен, другой нет. (Возможно. *)
Вы можете назначить только lvalues , которые являются тавтологически то, что вы можете назначить. Результат арифметического выражения обычно не то, что вы можете назначить.
Проще говоря: a = 1 + 2
в порядке, но 1 + 2 = a
нет. Вы можете дать a
значение, но вы не можете дать результат добавления целых чисел значение.
Назначение в C++ - это изменение состояния. Он сильно отличается от математической концепции «уравнений». Назначение в C++ больше похоже на определение в математике, но в отличие от математики вы можете переназначить значения для существующих объектов.
*) Перегрузка оператора усложняет изображение.
Чтобы решить ваши сомнения, вы должны понимать, OME концепции импорта: Lvalues and Rvalues
В коде regWages = regPay + overTime;
это правильно, потому что если переменная regWages
является Lvalues, это не является временным объектом, и вы можете сделать =
операция.
regPay + overTime = regWages;
не соответствует действительности, из-за результата regPay + overTime
является Rvalues, только временная переменная, вы не можете сделать =
операции.
Это забавно, но оба оператора могут быть действительными в зависимости от типа определения объектов.
regWages = regPay + overTime;
regPay + overTime = regWages;
Однако семантически они различны, оператор присваивания не является симметричным.
Если вы сомневаетесь, всегда пытайтесь скомпилировать его в текущем стандартном компиляторе. В качестве эксперимента я попробовал вторую строку (например, не ожидал многого). И компилятор говорит: «выражение не назначается». Это из компилятора C++ 11 на основе CLang ++ 3.1. –