Оператор присваивания. Запись значения в переменную на Си
Как Вы помните, переменные нужны чтобы хранить в них какие-то данные. Разберёмся как использовать переменные по их прямому назначению. Основной вопрос такой: "Как сохранить значение в переменной". Или вспоминая аналогию с коробкой "Как положить что-то в коробку?"
Ответ прост. Для этого существует специальный оператор, который называется оператором присваивания и обозначается символом равно "=". Обычно говорят не сохранить значение в переменную, а присвоить переменной значение.
Как работает оператор присваивания?
Сразу будем разбираться на примерах.
Листинг 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
Внимание на последнюю строчку! Хотя справа выражение целого типа, а слева вещественная переменная, данная команда всё равно будет работать так, как надо. Это из-за того, что все целые числа можно записать как вещественные, у которых дробная часть равна нулю. Подобная штука называется неявное приведение (преобразование) типов. С этой возможностью надо быть очень осторожным, т.к. компилятор не отслеживает такие ошибки. Другими словами программа будет скомпилирована, но работать будет неправильно. Мы ещё вернёмся к этому в следующем уроке, когда научимся выводить значение переменных на экран компьютера.
Оставить комментарий
Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]
Комментарии
Как вы верно отметили из-за отсутсвия ; программа не скомпилируется. Это синтаксическая ошибка.
Я новичек-финансист
результатом данного кода сталь нуль:
int main()
{
int z;
printf("z:%in", z);
}
А могло бы быть так, что там хранилось бы какое-то число, которое вы туда не сохраняли.
имхо, аналогия между ячейками памяти и коробочками сохраняется, просто коробочки настолько малы что в них можно хранить только одно значение данного типа. Если переменной присваивают новое значение - это означает что из коробочки с меткой, соответствующей имени данной переменной, извлекили и выкинули старое значение и положили новое. Если нужно хранить несколько значений сразу, то для этого существует блок, соеденнённых между собой коробочек, с меткой только на первой заглавной коробочке, т.е массив.
1. Да, n -- это имя переменной типа int, т.е. челочисленной переменной. a -- это тоже имя переменной типа int. В этой строке мы создали две переменные.
2. нет, это созданная нами переменная.
3. не совсем понял вопрос.
cum = 23.4; //как-то не совсем хорошо получается:)
Поправил!
Какой-то сплошной квест с туманным результатом.
В операции `x = 2+a;` переменная `a` будет преобразована из `int` в `double`. Для выполнения операции `2+a` сначала значение `a` будет преобразовано в `double`, затем к результату этой операции будет применен автоматический приведение типов к `double` и результат будет сохранен в `x`.
Таким образом, результатом выполнения операции `x = 2+a;` будет значение `4.0`, которое будет сохранено в переменной `x`.