Подтвердить что ты не робот

Что это значит? int я = (i = 20);

Я наткнулся на это, начав изучать здесь варны:

http://msdn.microsoft.com/en-us/library/bb384061.aspx

Однако я понятия не имею, как это юридическое выражение (оно есть). Я думал, что вы не можете назначить что-то, используя a = (b = c), потому что (b = c) не создает значение для назначения?

Спасибо за любые разъяснения по этому вопросу.

4b9b3361

Ответ 1

Это законно. На странице = ссылка оператора С#:

Оператор присваивания (=) сохраняет значение своего правого операнда в местоположении хранилища, свойстве или индексаторе, обозначенном его левым операндом, а возвращает значение в качестве результата.

(акцент мой)

Код в примере является изобретенным (и бессмысленным), но его можно использовать в других случаях, чтобы делать полезные вещи более кратким образом. Например:

BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
    // do useful things with returned node
}

Ответ 2

Вся цитата из MSDN:

Переменные, объявленные с помощью var, не могут использоваться в выражении инициализации. Другими словами, это выражение является законным: int я = (i = 20); но это выражение создает ошибку времени компиляции: var я = (i = 20);

Дело в том, что вы не можете использовать переменные, объявленные var в выражении инициализации. Другими словами, если вы используете var для объявления i, вы не можете использовать я на другой стороне знака =.

Как отмечали другие, вы бы не написали этот код. Это надуманный пример.

Ответ 3

Я все время использую такие вещи.

public class Parameters
{
    public readonly bool ContainsSquareBrackets;

    public Parameters(string paras)
    {
        if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
        {
             // do something ...
        }
    }
}

Ответ 4

Этот конкретный код бессмыслен. Выражение присваивания возвращает только что присвоенное значение. Следовательно, результат:

i = 20

Является, конечно, 20. Таким образом:

i = (i = 20);

То же, что и:

i = 20;

Иногда может быть полезно то, что присваивание возвращает что-то, например, для циклов:

for (string line; (line = reader.ReadLine()) != null;) { ... }

(Для чего это стоит, я бы не использовал эту идиому в этой конкретной ситуации)

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

int x, y;
x = y = 5;

Теперь как x, так и y имеют значение 5.

Ответ 5

Это законно в С#, потому что порядок оценки для операторов слева направо по умолчанию, в отличие от языков C/С++, которые не определите предел в точке последовательности.. Оператор = присваивает значение 20 и возвращает значение в качестве результата. Он анализировался как:

int i; //<- i is declared. 
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.

Это неоднозначное выражение

Ответ 6

Код является безопасным способом, не связанным с потоком, чтобы назначить буквенное значение 20 локальной переменной i.

Выражение i = 20 имеет побочный эффект при назначении 20 на i и имеет значение i после назначения. Выражение i = (i = 20) присваивает я значения (i = 20), что почти всегда является значением, которое i имеет во время внешнего присваивания. Если поток прерывается, выражение (i = 20) будет по-прежнему иметь значение 20, хотя у меня может быть другое значение в точке, где выполняется внешнее присвоение.

Нет никакой ситуации, в которой вы хотели бы написать этот точный код.

Ответ 7

В то время как это означает то же самое, что и i = 20, это может иметь полезную цель в определенных ситуациях.

Если кто-то еще сохранит ваш код и увидит что-то вроде этого:

if ( i = some_function() )

они могут подумать, что это ошибка и переместить = с помощью ==. Чтобы сигнализировать, что это то, что вы намеревались сделать, вы можете использовать

if ( i = (i = some_function()) )

Однако я лично считаю if ( i = /* = */ some_function() ) или просто i = some_function(); if (i) более чистым.

Ответ 8

В С++ и С# допустимо также следующее:

int я = я = я = 20;

Вышеприведенное утверждение является простым использованием оператора присваивания, назначающего клапаны справа налево.

Ответ 9

Вы можете сделать такой же подход, как объявить переменную.. это только тот, который вы читаете, затрудняет чтение.

Он существует, потому что его можно использовать для обфускации кода, по моему мнению, его присутствие имело глубокое соединение с безопасностью.

Ответ 10

Оператор присваивания возвращает назначенное значение.

Таким образом,

i = 20

возвращает 20

который присваивается i.

Итак,

i = (i = 20);

не хуже

i = 20;