On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 24.03.14 16:16. Заголовок: 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++ написано следующее:


 цитата:

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.



В то время как в стандарте С в параграфе 3 раздела 6.5.16 Assignment operators записано:


 цитата:

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.



Это различие в возвращаемом значении оператора присваивания делает некоторые корректные конструкции в C++ некорректными в C.

Например, следующие примеры предложений выражений буднт успешно компилироваться в C++

 
int a;
int b = 10, c = 20;

++( a = b );

( a = b ) += c;


Однако в C этот код является некорректным и компилятор выдаст сообщение об ошибках.

Конечно конструкции выглядят вычурными, но тем не менее, например, конструкция ++( a = b ) вполне может встретиться где-нибудь в цикле, где a и b могут быть итераторами.

Эту тему я открыл на основе вопроса, заданного на сайте на www.stackoverflow.com, к которому можно обратиться по ссылке

http://stackoverflow.com/questions/22609067/is-chained-assignment-in-c-c-undefined-behavior/22609184#22609184


Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 15
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет