Главная > Уроки > Оператор присваивания. Запись значения в переменную на Си

Записывайся на этот курс на Stepike!

Оператор присваивания. Запись значения в переменную на Си

Как Вы помните, переменные нужны чтобы хранить в них какие-то данные. Разберёмся как использовать переменные по их прямому назначению. Основной вопрос такой: "Как сохранить значение в переменной". Или вспоминая аналогию с коробкой "Как положить что-то в коробку?"

Ответ прост. Для этого существует специальный оператор, который называется оператором присваивания и обозначается символом равно "=". Обычно говорят не сохранить значение в переменную, а присвоить переменной значение.

Как работает оператор присваивания?

Сразу будем разбираться на примерах.

Листинг 1. Присваивание значения переменной

int z;	// объявляем переменную целого типа с именем z
z = 5;	// заносим в переменную число 5

double pi = 3.1415926; // создаём переменную и сразу присваиваем ей значение 

В примере выше показаны два способа присвоить значение переменной. В первом случае мы сначала создаём переменную, а потом записываем в неё значение, а во втором случае мы сразу создаём переменную и присваиваем ей значение.

Второй вариант записи короче, но делает в то же самое, что и первый. Берёт значение, которое записано справа от знака равно, и сохраняет его в переменную, которая записана слева от от него.

Частая ошибка!

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

Есть несколько важных моментов на которых надо отдельно заострить внимание:

  • в некоторых языках программирования, после того как вы создали переменную, в ней сразу же хранится значение нуль. В языке Си это не так. Пока переменной не присвоено какое-нибудь значение, в ней будет храниться "мусор". Как этот мусор выглядит мы посмотрим на следующем уроке.
  • справа от знака равно НЕ обязательно должно быть записано какое-то конкретное число, там может быть записано арифметическое выражение или имя переменной.

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

Если справа от знака равно записано выражение, то сначала вычисляется его значение и уже оно сохраняется в переменную, которая записана слева от =.

Листинг 2.

int n;	
n = 1+2;	// В переменную n записываем значение 3

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

Листинг 3.

int n=10;	// Создаём переменную и записываем в неё 10
n = 5;	// Теперь в переменной записано значение 5, а значение 10 удалено. 

Обратите внимание, новое значение не добавляется к старому, а полностью заменяет его. Я как-то говорил, что переменные похожи на коробки, но только на первый взгляд. Теперь мы видим, что наша аналогия с коробкой не совсем точная. Если бы в коробке лежало десять шариков, и мы бы туда положили ещё пять, то их стало бы 15.

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

Листинг 4.

int n=10, x=0; 	// можно инициализировать сразу несколько переменных
n = 5; 	// теперь n равно 5
x = n - 3; // x будет равно 2 (5-3)

При вычислении выражения n - 3, n равняется 5. Это потому, что исходное значение 10, заданное при инициализации, мы в программе изменяли. А при вычислениях используется текущее значение переменной.

В выражении справа от знака равенства может быть использована сама переменная.

Листинг 5.

int n=10;
n = n + 5; 	// n будет равно 15 (10+5)

Кажется, что это какой-то порочный круг, но на самом деле проблем здесь не возникнет. Т.к. сначала вычисляется выражение справа, а только потом происходит присваивание. По аналогии с предыдущим примером при вычислении значения справа от знака равно вместо переменной n будет подставлено её текущее значение, т.е. 10. Потом будет произведено сложение и присваивание.

Ещё один поучительный пример.

Листинг 6.

int x=5, y=0, z;
y = x + z; 	// что будет записано в переменной y?

Если Вы подумали что 5, то это неправильно. Никто не знает, что в ней будет записано. Т.к. неизвестно, что было записано в переменной z. Ещё раз напоминаю, что если переменной не присвоено никакое значение, в ней хранится не нуль, а неизвестно что.

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

Листинг 7.

int a = 2, b=9, c=4, D;
D = b*b - 4*a*c; 	// D будет равно 49 (9*9 - 4*2*4)  

Теперь ещё один важный момент, который надо понимать. Когда я рассказывал о типах данных, я говорил, что в переменной можно хранить значения только того же типа, что и тип переменной. Например, в переменную целого типа нельзя положить вещественное число. Этот принцип применяется и с выражениями. Чтобы программа работала корректно, необходимо, чтобы тип выражения или переменной справа от знака присваивания совпадал с типом переменной.

Посмотрим несколько примеров.

Листинг 8.

int n, a = 2;
double x, pi = 3.14;
char s = 'k'; 	// сохраняем в s символ k. Сам символ нужно написать в одинарных кавычках.  

s = pi; // неправильно. В коробку для символов пытаемся положить вещественное число
n = a*pi; // неправильно. В коробку для целых числе пытаемся положить 6.28 (2*3.14)
a = x; // неправильно. В целочисленную переменную пытаемся сохранить вещественное число

x = 2+a;	// ДОПУСТИМО!!! x будет равно 4.0

Внимание на последнюю строчку! Хотя справа выражение целого типа, а слева вещественная переменная, данная команда всё равно будет работать так, как надо. Это из-за того, что все целые числа можно записать как вещественные, у которых дробная часть равна нулю. Подобная штука называется неявное приведение (преобразование) типов. С этой возможностью надо быть очень осторожным, т.к. компилятор не отслеживает такие ошибки. Другими словами программа будет скомпилирована, но работать будет неправильно. Мы ещё вернёмся к этому в следующем уроке, когда научимся выводить значение переменных на экран компьютера.

Сохрани в закладки или поддержи проект.

Практика

  1. Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим

Дополнительные материалы

  1. пока нет

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

denis
int a = 2, b=9, c=4, D; D = b*b - 4*a*c; // D будет равно 64 (9*9 - 4*2*4) если посчитать D будет равно не 64, а 49. или я чего то не догоняю
KaDeaT
Да, действительно. Спасибо за внимательность, поправил.
артур
Этот принцип применяется и к (с) выражениями
KaDeaT
Спасибо. Поправил.
IamNotARobot
Практика. Чему равны значения переменных x,y после выполнения данного куска программы: int x=2, y=7; x = y; y = x; я полагаю, что x=7, y=2 но в ответах нет такого и поэтому всегда получаем ошибку x=2, y=2 x=7, y=7 x=7, x=2 x=2, y=7 x=7, x=2 - ыозможно тут ошибка?
KaDeaT
Добрый день. Если вы про вот эту задачу, то там есть правильный ответ. И он как раз совпадает с тем, что вы написали.
artdark
А присвоение x = y будет работать? ведь в конце команды отсутствует ;
KaDeaT
Нет, не будет.
Как вы верно отметили из-за отсутсвия ; программа не скомпилируется. Это синтаксическая ошибка.
rostikkam92
Все нравится
Я новичек-финансист
KaDeaT
Ну и хорошо! Успехов в обучении.)
Anastasia
объясните, что подразумевается под "мусором"?
результатом данного кода сталь нуль:
int main()
{
int z;
printf("z:%in", z);
}
KaDeaT
У вас нуль потому что ваш компилятор, видимо, обнуляет вновь созданные переменные. Но это особенности реализации вашего компилятора.

А могло бы быть так, что там хранилось бы какое-то число, которое вы туда не сохраняли.
Sasha
где мой секретный ключ....
KaDeaT
На степике)
Лёха
"Я как-то говорил, что переменные похожи на коробки, но только на первый взгляд. Теперь мы видим, что наша аналогия с коробкой не совсем точная. Если бы в коробке лежало десять шариков, и мы бы туда положили ещё пять, то их стало бы 15."

имхо, аналогия между ячейками памяти и коробочками сохраняется, просто коробочки настолько малы что в них можно хранить только одно значение данного типа. Если переменной присваивают новое значение - это означает что из коробочки с меткой, соответствующей имени данной переменной, извлекили и выкинули старое значение и положили новое. Если нужно хранить несколько значений сразу, то для этого существует блок, соеденнённых между собой коробочек, с меткой только на первой заглавной коробочке, т.е массив.
KaDeaT
Можно и так, но всё-таки это уже не совсем прямая аналогия.)
Дмитрий
Отлично, понятно, спасибо автору ! :)
KaDeaT
И вам спасибо! Приходите ещё
sologeek
 Вопросы:
1) int n, a = 2; - n это название переменной int? непонятно что тут означает а?
2) pi (из примера double x, pi = 3.14;) это константа в языке си?
3) a = x; x может выступать только как значение вещественного числа?
KaDeaT
Ответы:
1. Да, n -- это имя переменной типа int, т.е. челочисленной переменной. a -- это тоже имя переменной типа int. В этой строке мы создали две переменные.

2. нет, это созданная нами переменная.

3. не совсем понял вопрос.
Провидец
№18 задание 6:
cum = 23.4; //как-то не совсем хорошо получается:)
KaDeaT
Ахахаха.
Поправил!
EuSe
Отображается всё как-то криво. Висит дисклеймер "переключайтесь в полноэкранный режим" - непонятно, что имеется в виду, переключить у себя в браузере - ничего не меняется, как приходится экран постоянно скролить туда сюда, так и остаётся; из за этого часто не видно части задания вверху или внизу фрейма - если же имеется в виду какой-то особый режим у вас на странице - нет никаких кнопок или других контролов.
Какой-то сплошной квест с туманным результатом.
Артур
С Вашим ответом по поводу операторов присваивания все верно, кроме одной детали.

В операции `x = 2+a;` переменная `a` будет преобразована из `int` в `double`. Для выполнения операции `2+a` сначала значение `a` будет преобразовано в `double`, затем к результату этой операции будет применен автоматический приведение типов к `double` и результат будет сохранен в `x`.

Таким образом, результатом выполнения операции `x = 2+a;` будет значение `4.0`, которое будет сохранено в переменной `x`.