Как присвоить переменной значение из файла

Обновлено: 04.07.2024

Программируя на языке C++, мы создаем, обрабатываем и уничтожаем объекты. Объект — это часть памяти, которая может хранить значение. В качестве аналогии мы можем использовать почтовый ящик, куда мы помещаем информацию и откуда её извлекаем. Все компьютеры имеют оперативную память, которую используют программы. При создании объекта, часть оперативной памяти выделяется для этого объекта. Большинство объектов, с которыми мы будем работать в языке C++, являются переменными.

Переменные

Cтейтмент a = 8; выглядит довольно простым: мы присваиваем значение 8 переменной a . Но что такое a ? a — это переменная, объект с именем.

На этом уроке мы рассмотрим только целочисленные переменные. Целое число — это число, которое можно записать без дроби, например: -11, -2, 0, 5 или 34.

Для создания переменной используется стейтмент объявления (разницу между объявлением и определением переменной мы рассмотрим несколько позже). Вот пример объявления целочисленной переменной a (которая может содержать только целые числа):

При выполнении этой инструкции центральным процессором часть оперативной памяти выделяется под этот объект. Например, предположим, что переменной a присваивается ячейка памяти под номером 150. Когда программа видит переменную a в выражении или в стейтменте, то она понимает, что для того, чтобы получить значение этой переменной, нужно заглянуть в ячейку памяти под номером 150.

Одной из наиболее распространенных операций с переменными является операция присваивания, например:

Затем мы сможем вывести это значение на экран с помощью std::cout:

std :: cout << a ; // выводим значение переменной a (ячейка памяти под номером 150) на экран

l-values и r-values

Вот несколько примеров операций присваивания с использованием r-values:

a = 5 ; // 5 имеет значение 5, которое затем присваивается переменной а a = 4 + 6 ; // 4 + 6 имеет значение 10, которое затем присваивается переменной а b = a ; // a имеет значение 10 (исходя из предыдущих операций), которое затем присваивается переменной b b = b ; // b имеет значение 10, которое затем присваивается переменной b (ничего не происходит) b = b + 2 ; // b + 2 имеет значение 12, которое затем присваивается переменной b

Давайте детально рассмотрим последнюю операцию присваивания:

Здесь переменная b используется в двух различных контекстах. Слева b используется как l-value (переменная с адресом в памяти), а справа b используется как r-value и имеет отдельное значение (в данном случае, 12 ). При выполнении этого стейтмента, компилятор видит следующее:

И здесь уже понятно, какое значение присваивается переменной b .

Сильно беспокоиться о l-values или r-values сейчас не нужно, так как мы еще вернемся к этой теме на следующих уроках. Всё, что вам нужно сейчас запомнить — это то, что в левой стороне операции присваивания всегда должно находиться l-value (которое имеет свой собственный адрес в памяти), а в правой стороне операции присваивания — r-value (которое имеет какое-то значение).

Инициализация vs. Присваивание

В языке C++ есть две похожие концепции, которые новички часто путают: присваивание и инициализация.

После объявления переменной, ей можно присвоить значение с помощью оператора присваивания (знак равенства = ):

int a = 8 ; // инициализируем переменную a значением 8

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

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

Правило: Если у вас изначально имеется значение для переменной, то используйте инициализацию, вместо присваивания.

Неинициализированные переменные

В отличие от других языков программирования, языки Cи и C++ не инициализируют переменные определенными значениями (например, нулем) по умолчанию. Поэтому, при создании переменной, ей присваивается ячейка в памяти, в которой уже может находиться какой-нибудь мусор! Переменная без значения (со стороны программиста или пользователя) называется неинициализированной переменной.

Использование неинициализированных переменных может привести к ошибкам, например:

// Выводим значение переменной a на экран (a - это неинициализированная переменная)

В этом случае компилятор присваивает переменной a ячейку в памяти, которая в данный момент свободна (не используется). Затем значение переменной a отправляется на вывод. Но что мы увидим на экране? Ничего, так как компилятор это не пропустит — выведется ошибка, что переменная a является неинициализированной. В более старых версиях Visual Studio компилятор вообще мог бы вывести какое-то некорректное значение (например, 7177728 , т.е. мусор), которое было бы содержимым той ячейки памяти, которую он присвоил нашей переменной.

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

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

Правило: Убедитесь, что все ваши переменные в программе имеют значения (либо через инициализацию, либо через операцию присваивания).

Какой результат выполнения следующих стейтментов?

Ответы

Чтобы просмотреть ответ, кликните на него мышкой.

Ответ №1

Программа выведет 3 : a – 3 = 3 , что и присваивается переменной a .

Ответ №2

Программа выведет 3 : переменной b присваивается значение переменной a ( 3 ).

Ответ №3

Программа выведет 6 : a + b = 6 . Здесь не используется операция присваивания.

Ответ №4

Программа выведет 3 : значением переменной a до сих пор является 3 .

Ответ №5

Результатом будет ошибка, так как c — это неинициализированная переменная.

(1 294 оценок, среднее: 4,94 из 5)

Урок №9. Комментарии

Комментариев: 33

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

a = 5 ; // 5 вычисляется в 5, которое затем присваивается переменной а a = 4 + 6 ; // 4 + 6 вычисляется в 10, которое затем присваивается переменной а

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

Читай комментарий(5 вычисляется в 5, которое затем присваивается переменной а). Это для наглядности сделано, типа что бы ты понял как присвоить значение. Но на практике такое особо не делается без вывода. Если не понятно то что я сказал то напиши cout <<a<<endl; после(a = 5;) и напиши cout <<a <<endl; после (a = 4 + 6;)

Это же очевидно! Например:
Вам нужно запомнить координаты движущегося квадрата.
Таким образом Ваш код будет такой:

И соответственно отрисовка квадрата. А в y и x у вас координаты.
Переменная от слова менять.

Левое значение, оперативка. Сразу видно чёткого программера, не заморачивающегося стилистикой речи. Но это я так, не по теме =) По крайней мере, с начала изучения твоего ресурса я не испытываю ощутимого дискомфорта в понимании материала. Надеюсь, эта тенденция сохранится впредь.

Все отлично, было 13 лет назад баловался на С. Универ требовал и надо было.
Сейчас вспоминаю, изучаю.
Пишу эти простые проги на Ubuntu, неинициализированная переменная при выводе выдаст 0.

Далеко не всегда 0. Тут как повезёт. Локальные переменные не инициализируются точно. Если у вас всегда 0, возможно, проверяете на какой-нибудь простецкой программе, которую компилятор вполне мог заоптимизировать и поменять переменную на константу, видя, что с ней ничего кроме вывода на экран не происходит.

Храни тебя господь, Юрий!)
Благодарю вас урок очень понравился, так доступно объясняете.

Юрий :

Спасибо, что читаете 🙂

b = b + 2 ; // b + 2 вычисляется в 12, которое затем присваивается переменной b

При выполнении этого стейтмента, компилятор видит следующее:

Откуда компилятор видит, что b == 10?
То, что b равно 10 будет известно только в рантайме, нет?

Скажите пожалуйста. Задумался об изучении программирования, учусь в техюунивере по профессии программная-инженерия. В приоритете такие языки как С++ и JavaScript. скажите пожалуйста, что лучше изучить сначала. Если С++ то за какое время смогу освоить ее нормально. JS рассматриваю в качестве быстро устроиться на работу, т. к. стипендия маленькая. Нужно как ты жить? Спасибо!

Освой html+css+js и устройся в какую-нибудь конторку верстальщиком на небольшую зарплату (если Москва, то минимум 20 тысяч, на еду и одежду с рынка хватит, но если ты квартиру снимаешь, то надо исходить из стоимости аренды). Если ты беспокоишься о "порче" мозгов из-за изучения js, после которого будет, якобы, сложнее изучить C++ (лично меня этим пугали), то нет, ничего подобного.

Чувак, если тебе нужно на что-то жить, то устройся лучше в МакДональдс. Я абсолютно серьезно.

Чтобы зарабатывать деньги программированием нужно быть профи, с опытом, для С++ с БОЛЬШИМ опытом. Опыта набираются на бесплатных работах: контрибутя в опенсорс (это если согласяттся еще принять) или придумывают себе свой проект.

Верстальщики (а они ообще нужны кому-нибудь в 2019?) не исключение, просто путь покороче. Но это путь в никуда.

груСНые реалии суровой жизни

а есть ли разница в написании инициализации? ну может быть время выполнение или объем кода?

А можно написать вначале "using namespace std", чтобы при записи кода не писать "std"?

Юрий :

Хорошо, давай по порядку.

Вопрос №1: "Зачем я используя английские слова?".

И когда человек ищет дополнительную информацию в Гугле, то лучше он наберёт англицизм и получит релевантный ответ со списком из 10-30 РЕЛЕВАНТНЫХ сайтов, нежели введёт "левостороннее присваивание" и получит НЕРЕЛЕВАНТНЫЙ ответ из всего 5 ссылок, где упоминается этот чудо-термин".

Вопрос №2: "Почему я не использую "выражение" в качестве перевода "statement"?"

Вопрос №3: "Почему у меня перевод l-value и r-value, а не "левостороннее и правостороннее присваивание, выражение, значение или ещё что"?

Ответ №3: "См. ответ №1. Да можно было бы использовать левостороннее/правостороннее значение (но никак не "левостороннее/правостороннее присваивание"), но этот вариант, по моему мнению, хуже того, что есть (см. второй абзац Ответа №1)".

Вопрос №4: "Читал ли я книги по программированию и изучал ли программирование до этого?".

Ответ №4: "Не дочитал ни одну книгу по программированию. Да, изучал ещё в колледже и изучаю (если так можно выразиться вообще) в университете".

> "л и р — вэлью" — левостороннее и правостороннее присваивание
> "вэлью"
> присваивание
Иди лучше дальше, не останавливайся

Читайте также: