Почему операторы присваивания возвращают значение? - PullRequest
122 голосов
/ 27 сентября 2010

Это разрешено:

int a, b, c;
a = b = c = 16;

string s = null;
while ((s = "Hello") != null) ;

Насколько я понимаю, присваивание s = ”Hello”; должно приводить к назначению “Hello” только для s, но операция не должна возвращать никакого значения.Если бы это было правдой, то ((s = "Hello") != null) выдаст ошибку, поскольку null будет сравниваться ни с чем.

Какова причина, позволяющая операторам присваивания возвращать значение?

Ответы [ 13 ]

1 голос
/ 21 января 2017

Еще один отличный пример использования, я использую это все время:

var x = _myVariable ?? (_myVariable = GetVariable());
//for example: when used inside a loop, "GetVariable" will be called only once
1 голос
/ 28 сентября 2010

Тот факт, что «a ++» или «printf (« foo »)» может быть полезен либо как отдельное выражение, либо как часть более крупного выражения, означает, что C должен учитывать возможность того, что результаты выражения могут или не может быть использован. Учитывая это, существует общее понятие, что выражения, которые могут с пользой «возвращать» значение, могут также делать это. Цепочка назначений может быть немного «интересной» в C и даже более интересной в C ++, если все рассматриваемые переменные не имеют точно одинаковый тип. Такое использование, вероятно, лучше избегать.

0 голосов
/ 02 октября 2010

Дополнительным преимуществом, которое я не вижу в ответах здесь, является то, что синтаксис для присваивания основан на арифметике.

Теперь x = y = b = c = 2 + 3 означает что-то иное в арифметике, чем язык в стиле C; в арифметике это утверждение, мы заявляем , что x равен y и т. д., а в языке стиля C это инструкция, которая делает x равным y и т. д. после ее выполнения .

Тем не менее, между арифметикой и кодом все еще достаточно взаимосвязи, чтобы не было смысла запрещать то, что естественно в арифметике, если нет веской причины. (Другая вещь, которую языки C-стиля взяли от использования символа равенства, - это использование == для сравнения на равенство. Здесь, хотя, поскольку крайний правый == возвращает значение, такой вид цепочки был бы невозможен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...