2013-10-25 2 views
4

Мне очень глупо задавать этот вопрос. но не могу понять причину самостоятельно.Как это оценивается?

int main() 
{ 
    int target; 
    int buffer =10; 
    const int source = 15; 
    target = (buffer+=source) = 20; 
    cout << target+buffer; 
    return 0; 
} 

target = (buffer+=source) = 20; станет target = (25) = 20.

Но если я даю такую ​​же инструкцию в исходном файле, она дает ошибку l-value.

Как значение target+buffer печатает 40.

+1

Прохождение через отладчик поможет вам здесь. – benjymous

+3

Вы не [пытаетесь скомпилировать это с помощью компилятора C] (http://stackoverflow.com/a/10654019/335858), не так ли? – dasblinkenlight

+3

Я уверен, что это будет неопределенное поведение из-за последовательности. – Bathsheba

ответ

5

Некоторых предопределенных операторов, такие как + =, требуется операнд будет именующим выражения применительно к основным типам [§13.5/7]

buffer+=source возвращает ссылку lvalue на buffer. Итак, вы не компилируете ошибку.

вашего заявление может быть распознано как:

buffer+=source; 
buffer=20; 
target=20; 

Но изменения buffer дважды в заявлении является неопределенного поведения и другой компилятор может оценить что-то другое, как результат. (Не уверен в этом случае тоже!)

+0

@jrok: Спасибо, я этого раньше не заметил. Ред. – deepmax

+1

Не благодарите меня слишком рано, я действительно не уверен. :) * «Во всех случаях назначение упорядочивается после значения вычисления правого и левого операндов и перед вычислением значения выражения присваивания. * Я уверен, что он не был определен в C++ 03, но эта цитата из C++ 11. – jrok

+0

@jrok: Итак, вы можете задать большой вопрос в SO об этом, и у вас есть мой +1 для этого :-) – deepmax

Смежные вопросы