Представьте, что мы пишем программу, которая складывает два числа и выводит результат на экран два или даже пять раз. Можно решить задачу в лоб и написать следующее:
int main() {
std::cout << 2 + 3;
std::cout << 2 + 3;
}
Но тут возникает проблема, что если результат сложения этих двух чисел нам понадобится где-то в программе или мы захотим поменять значение одного из слагаемых?
Нам придется найти все места в программе и выполнить необходимую замену. Но можно сделать это более изящно. Достаточно определить три переменные, в которых мы будем хранить значение чисел и результат их сложения. Давайте перепишем код с учетом наших новых знаний:
int main() {
int num_one = 2;
int num_two = 3;
int result = num_one + num_two;
std::cout << result;
return 0;
}
Разберем подробнее что тут происходит. Когда мы определяем переменную, в начале указываем ключевое слово, которое обозначает тип данных.
В данном случае у нас тип int или integer, то есть целое число. После типа идет имя переменной, оператор присваивания и значение которое будет хранится в переменной.
Стоит учитывать, С++ - это регистрозависимый язык и переменные int num и int Num - это две разные переменные. Кроме того, в качестве имени переменной нельзя использовать ключевые слова языка C++.
Можно определить переменную, не присваивая ей значение:
int num;
Но так делать не стоит, потому что, если вы ее забудете проинициализировать, компилятор ей присвоит значение по умолчанию. Какое? Тут уже зависит от компилятора и места определения переменной.
В примере ниже использовался компилятор clang:
int num_out;
int main() {
int num_in;
std::cout << "The num_out = " << num_out << std::endl;
std::cout << "The num_in = " << num_in << std::endl;
}
Компилятор присвоил переменной значение 0.
The num_out = 0 The num_in = 0
Хорошей практикой считается определять переменную ближе к тому месту в коде где она будет использоваться и инициализировать сразу нейтральным значением.
Например, если это счетчик цикла, то 0, если в переменную будет собираться строка, то пустой строкой.
int main() {
string acc = "";
acc = acc + "Hello, ";
acc = acc + "World!";
std::cout << acc;
}
Hello, World!
C++ поддерживает три основных способа инициализации переменных. Во-первых, мы можем выполнить копирующую инициализацию, используя знак равенства:
int age = 18; // копирующая инициализация значения 18 в переменную age
Подобно копирующему присваиванию, этот код копирует значение с правой стороны знака равно в переменную, создаваемую с левой стороны. Во-вторых, мы можем выполнить прямую инициализацию с помощью скобок:
int age(18); // прямая инициализация значения 18 в переменную age
Для простых типов данных копирующая и прямая инициализации, по сути, одинаковы. Различия между копирующей инициализацией и прямой инициализацией мы разберем далее в курсе.
И третий тип инициализации - списковая. Списковая инициализация - это более унифицированный механизм инициализации, подходит как для простых типов, так и для составных, которые мы будем рассматривать дальше по курсу.
Инициализация списком бывает двух форм:
int width { 5 }; // прямая инициализация списком значения 5 в переменную width (предпочтительно)
int height = { 6 };
Эти две формы функционируют почти одинаково, но обычно предпочтительнее прямая форма.
Внутри функции main
определите переменную типа int
, присвойте ей значение 42 и выведите на экран.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#include "test_helper.h"
2
3TEST_CASE("testing solution") {
4 std::string expected = "42\n";
5 std::string actual = get_output(sizeof(expected));
6
7 CHECK(actual == expected);
8}
9
Решение учителя откроется через: