Форум » C/C++ для начинающих (C/C++ for beginners) » Is there any difference between assignment operators in C++and C? » Ответить

Is there any difference between assignment operators in C++and C?

Сыроежка: Даже если спросить опытного программиста, то не каждый сможет ответить на вопрос, имеется ли различие в операторах присваивания в C++ и C, не заглядывая при этом в соответствующие стандарты двух этих языков. Важным отличием этих операторов в C++ и в C является то, что в C++ значением выражения оператора присваивания является lvalue левого операнда, в то время как в C возвращается rvalue. Вот что об этом говорится в стандартах. В параграфе 1 раздела 5.17 Assignment and compound assignment operators чтвелвртв C++ написано следующее: [quote] 1 The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand. The result in all cases is a bit-field if the left operand is a bit-field. In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. [/quote] В то время как в стандарте С в параграфе 3 раздела 6.5.16 Assignment operators записано: [quote] 3 An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,111) but is not an lvalue. The type of an assignment expression is the type the left operand would have after lvalue conversion. The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced. [/quote] Это различие в возвращаемом значении оператора присваивания делает некоторые корректные конструкции в C++ некорректными в C. Например, следующие примеры предложений выражений буднт успешно компилироваться в C++ [pre2] int a; int b = 10, c = 20; ++( a = b ); ( a = b ) += c; [/pre2] Однако в C этот код является некорректным и компилятор выдаст сообщение об ошибках. Конечно конструкции выглядят вычурными, но тем не менее, например, конструкция ++( a = b ) вполне может встретиться где-нибудь в цикле, где a и b могут быть итераторами. Эту тему я открыл на основе вопроса, заданного на сайте на www.stackoverflow.com, к которому можно обратиться по ссылке http://stackoverflow.com/questions/22609067/is-chained-assignment-in-c-c-undefined-behavior/22609184#22609184

Ответов - 0



полная версия страницы