Перейти к содержимому

Для чего используется оператор присваивания c

  • автор:

Справочник по C#. Операторы присваивания

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

Оператор присваивания = имеет правую ассоциативность, то есть выражение формы:

a = b = c 
a = (b = c) 

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

List numbers = [1.0, 2.0, 3.0]; Console.WriteLine(numbers.Capacity); numbers.Capacity = 100; Console.WriteLine(numbers.Capacity); // Output: // 4 // 100 int newFirstElement; double originalFirstElement = numbers[0]; newFirstElement = 5; numbers[0] = newFirstElement; Console.WriteLine(originalFirstElement); Console.WriteLine(numbers[0]); // Output: // 1 // 5 

Левый операнд назначения получает значение правого операнда. Если операнды имеют типы значений, назначение копирует содержимое правого операнда. Если операнды имеют ссылочные типы, назначение копирует ссылку на объект.

Это называется назначением значений: присваивается значение.

Назначение ссылок

Назначение = ref Ref делает его левый операнд псевдонимом правой операнда, как показано в следующем примере:

void Display(double[] s) => Console.WriteLine(string.Join(" ", s)); double[] arr = < 0.0, 0.0, 0.0 >; Display(arr); ref double arrayElement = ref arr[0]; arrayElement = 3.0; Display(arr); arrayElement = ref arr[arr.Length - 1]; arrayElement = 5.0; Display(arr); // Output: // 0 0 0 // 3 0 0 // 3 0 5 

В предыдущем примере локальная ссылочная переменная arrayElement инициализируется как псевдоним первого элемента массива. Затем он ref переназначется для ссылки на последний элемент массива. Как это псевдоним, при обновлении его значения с помощью обычного оператора = присваивания соответствующий элемент массива также обновляется.

Левый операнд ref назначения может быть локальной ссылочной переменной, ref полем и параметром метода или in методом ref out . Оба операнда должны иметь одинаковый тип.

Составное присваивание

Для бинарного оператора op выражение составного присваивания в форме

x op= y 
x = x op y 

за исключением того, что x вычисляется только один раз.

Присваивание объединения со значением NULL

Можно использовать оператор ??= присваивания назначения null-mergeescing, чтобы назначить значение правого операнда левой операнда только в том случае, если левый операнд оценивается null . Дополнительные сведения см. в статье Операторы ?? и ??=.

Возможность перегрузки оператора

Определяемый пользователем тип не может перегружать оператор назначения. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.

Явная перегрузка составного оператора присваивания для пользовательского типа невозможна. Но если пользовательский тип перегружает бинарный оператор op , существующий оператор op= также будет неявно перегружен.

Спецификация языка C#

Подробные сведения см. в разделе Assignment operators (Операторы присваивания) в спецификации языка C#.

См. также

  • справочник по C#
  • Операторы и выражения C#
  • Ключевое слово ref
  • Использование составного присваивания (правила стиля IDE0054 и IDE0074)

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Для чего используется оператор присваивания c

Оператор — это отдельное предложение на языке программирования, имеющее законченный смысл. На языке C++ любой оператор заканчивается символом ; (точка с запятой). При этом надо учитывать один нюанс: если в языках типа Паскаль точка с запятой — разделитель между операторами, то в C++ и других C-подобных языках — это обязательная часть оператора.

Операторы условно можно подразделить на две категории: исполняемые — с их помощью реализуется алгоритм решаемой задачи, и описательные , необходимые для определения типов пользователя и объявления объектов программы, например, переменных.

Рассмотрим подробнее исполняемые операторы.

Классификация исполняемых операторов

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

К простым операторам относятся: оператор присваивания, оператор-выражение, пустой оператор, операторы перехода ( goto , continue , break , return ), вызов функции как отдельного оператора.

Структурированные операторы — это операторы ветвление ( if ), выбора ( switch ), цикла ( for , while , do ).

Теперь перейдём к рассмотрению отдельных операторов.

Оператор присваивания

Оператор присваивания — это самый употребительный оператор. Его назначение — присвоить новое значение какой-либо переменной. В C++ имеется три формы этого оператора.

1) Простой оператор присваивания записывается так:

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

Слева от знака = может быть только переменная, справа же можно записать и константу, и переменную и вообще выражение любой сложности.

2) Множественное присваивание — в таком операторе последовательно справа налево нескольким переменным присваивается одно и то же значение, например:

Так можно сразу определить, к примеру, что в равностороннем треугольнике все стороны равны одному и тому же числу 1. Приведенный выше оператор эквивалентен последовательному выполнению трёх операторов:

Естественно, нам проще записать один оператор, а не три. Программа получается короче, более естественно смотрится текст, и работает такая конструкция немного быстрее.

3) Присваивание с одновременным выполнением какой-либо операции в общем виде записывается так:

переменная знак_операции = выражение;

и равносильно записи

переменная = переменная знак_операции выражение ;

s += 5; // 1-й вариант

делает то же самое, что и оператор

s = s + 5; // 2-й вариант

а именно: взять старое значение из переменной s , прибавить к нему число 5 и полученное значение снова записать в переменную s .

Как видим, запись 1-го варианта короче записи 2-го варианта, да и выполняется быстрее, так как в 1-м варианте адрес переменной s вычисляется 1 раз, а во 2-м варианте — дважды.

Оператор-выражение

В языке C++ любое выражение (арифметическое, логическое, и т.д.), которое заканчивается символом ; (точка с запятой), считается законченным предложением, т.е. оператором. Примеры:

1)Выполняется префиксная операция автоуменьшения:

2)Выполняется постфиксная операция автоувеличения:

3)Выполняется перегруженная операция вывода

4)Вызывается функция вывода данных на дисплей монитора (выводится текст «Test»):

5)Вычисляется сумма двух чисел, но её значение не присваивается ни какой переменной. Оператор бессмысленный, но возможный:

Пустой оператор

Пустой оператор — это оператор, который ничего не выполняет. Зачем нужен «бесполезный» оператор?

Пустой оператор используется в тех случаях, когда по синтаксису языка требуется записать какой-либо оператор, а по логике программы мы не собираемся что-либо делать. Так, пустой оператор может потребоваться в операторе ветвления, когда по какой-либо ветви ничего не требуется выполнять, так же для того, чтобы определить метку для перехода в тексте программы, а иногда — для пустого тела цикла.

Пустой оператор — это одиночный символ ; (точка с запятой), например:

Здесь первый символ ; (точка с запятой) завершает оператор присваивания, а второй символ как раз и даёт нам пустой оператор. В данной ситуации пустой оператор совсем не нужен (но и не является синтаксической ошибкой!), приведен только для пояснения. Более «разумные» примеры использования пустого оператора будут приведены позже в соответствующих темах.

Операторы перехода

Для изменения последовательного выполнения операторов используются операторы перехода. Это операторы goto , continue , break , return. Рассмотрим их подробнее.

Этот оператор позволяет сделать переход в пределах текущей функции. Переход возможен как по ходу выполнения программы, так и в обратном направлении. Пример:

Здесь Metka — это идентификатор (метка), обозначающий то место в тексте программы, куда делается переход. Такая метка не требует описания (её и нельзя описывать!), задается по общим правилам и не может совпадать ни с ключевыми словами, ни с именами объектов программы.

В языке C++ этот оператор используется редко. Необдуманное применение goto приводит к затруднению понимания текста программы. Как правило, если в тексте программы требуется использование этого оператора, то это означает слабую логику в проектировании алгоритма программы.

На мой взгляд, оператор goto есть смысл использовать только для принудительного выхода из вложенных циклов.

Данный оператор применяется для выхода из операторов циклов ( for , while , do ) или оператора выбора switch . При использовании этого оператора метки не нужны, как как управление передаётся на оператор, следующий за оператором цикла или выбора.

Вот этот оператор в программах на C++ применяется очень часто! А оператор switch вообще без break не используют. Примеры применения оператора break рассмотрим в соответствующих темах.

Позволяет передать управление в конец цикла. Применяется гораздо реже, чем оператор break . Как правило, всегда можно построить алгоритм решаемой задачи без использования оператора continue . Пример применения оператора continue рассмотрим в теме «Циклы».

Обеспечивает выход из функции. Управление передаётся оператору, следующему за вызовом функции. Примеры применения оператора return рассмотрим в темах, связанных с использованием функций.

Оператор присваивания

где выражение может быть как простой одиночной константой, так и сложной комбинацией переменных, операторов и констант. Как в Бейсике и Фортране, в С используется знак равенства для отображения операции присваивания (не так, как в Паскале или Модуле-2, где используется конструкция :=). В левой части оператора присваивания должна стоять переменная, а не функция или константа.

  • Многочисленное присваивание
  • Преобразование типов при присваивании
  • Инициализация переменных

Оператор присваивания

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

#include #include int main()

В этом примере переменной c присваивается значение 10, после чего оператор присваивания возвращает значение 10, которое используется следующим оператором, и присваивает значение 10 переменной b, после чего возвращает значение 10, которое используется следующим оператором. Это свойство — возвращать значение — часто используется. Например, при выделении памяти мы можем узнать, была ли действительно выделена память.

#include #include #include int main() < int *a = NULL; printf("Try to allocate memory\n"); if (a = (int*)malloc(1024*1024*1024 * sizeof(int))) < printf("Memory was allocated"); >else < printf("Error: can't allocate memory"); >getch(); free(a); >

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

a = (int*)malloc(1024*1024*1024 * sizeof(int)); if (a) < printf("Memory was allocated"); >else

(вам этот пример кажется непонятным, здесь важно для вас только использование оператора =).

rvalue и lvalue

Л юбая переменная связана с адресом в памяти и хранит некоторое значение. Выражение типа

int i; i = 20;

говорит о том, что мы заносим в область памяти, на которую указывает переменная i значение 20. Выражение
20 += 3;
не имеет смысла, поскольку 20 — это литерал, значение, которое не связано с областью памяти.
Для обозначения объектов, которым может быть присвоено значение, используется понятие lvalue (буквально, то, что может стоять слева от оператора присваивания). Для обозначения объектов, которые имеют только значения, используют выражение rvalue (то, что стоит справа от оператора присваивания). lvalues в свою очередь делят на modifiable lvalues, которые могут быть изменены, и non-modifiable lvalues, которые связаны с областью памяти, но не могут быть изменены, например, константы. В том случае, если lvalue стоит справа от оператора присваивания, например

int i, j; j = 20; i = j;

то происходит lvalue-to-rvalue convertion, преобразование lvalue к rvalue.
К rvalue относятся результаты арифметических выражений, преобразование не к ссылочным типам, результат постфиксных операций ++ и —, литералы за исключением строк.
К lvalue относятся переменные, выражения ссылочных типов, результат операции разыменования *, строковые литералы, результат префиксных операций ++ и — над ссылочными типами.
Имена функций и массивов, также объявленные как немодифицируемые объекты, являются non-modifiable lvalues.

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

email

Всё ещё не понятно? – пиши вопросы на ящик

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *