Базовый синтаксис: инструкции
Концепты
Заголовок раздела «Концепты»- Исходный файл
- Компилирование и запуск программы
- Инструкции программы
- Порядок выполнения инструкций
- Инструкция печати в консоль
- Функции без параметров
- Особая функция
main - Тело функции
- Пустая функция
- Комментарии
- Порядок определения инструкции программы
Задачи на анализ
Заголовок раздела «Задачи на анализ»Что произойдет при компилировании этих отрезков кода? А при выполнении?
1. Пустой main
Заголовок раздела «1. Пустой main»int main(){}Ответ
Эта программа успешно скомпилируется.
Функция main автоматически запустится при запуске этой программы.
Сама функция не содержит инструкций в теле (пустые фигурные скобки).
По этой причине, при выполнении main ничего не будет напечатано.
2. Печать строки
Заголовок раздела «2. Печать строки»int main(){ std::cout << "Hello world"; std::cout << std::endl;}Интуиция для std::cout <<
std — это сокращение для standard.
Можете запомнить, что std:: указывает, что функция из стандартной библиотеки.
Слово cout состоит из
cобозначает слово “console”, консоль;outэто сокращение для “output”, как вывод в консоль.
<< как бы запихивает следующую за собой строку в std::cout.
Ответ
Эта программа не скомпилируется.
Произойдет ошибка компиляции по той причине,
что нет строки #include <iostream> перед int main()
(не включен хедер <iostream>).
Без этой строки, компилятор не знает о существовании инструкции печати.
3. Исправленный код печати строки
Заголовок раздела «3. Исправленный код печати строки»#include <iostream>
int main(){ std::cout << "Hello world"; std::cout << std::endl;}Ответ
Эта программа скомпилируется.
При запуске выполнятся инструкции из функции main,
печатая “Hello world”.
Что делает std::endl?
endl означает “end line” (end + line, конец строки).
Он завершает текущую строку вывода (как нажатие Enter)
и сбрасывает буфер вывода, чтобы вывод сразу появился на экране.
4. Печать на той же строке
Заголовок раздела «4. Печать на той же строке»#include <iostream>
int main(){ std::cout << "Hello world" << std::endl;}Ответ
Этот код эквивалентен следующему:
std::cout << "Hello world";std::cout << std::endl;5. Пустая функция A
Заголовок раздела «5. Пустая функция A»void A(){}Ответ
Программа ожидает, что существует функция main для удачной компиляции.
Поскольку main нет, программа не скомпилируется
(дав ошибку на фазе линкинга, о чем будет подробнее в одном из дальнейших уроков).
(.text+0x1b): undefined reference to `main'collect2: error: ld returned 1 exit statusld это название программы линкера.
6. Функция A
Заголовок раздела «6. Функция A»void A(){ std::cout << "Hello World." << std::endl;}Ответ
Произойдет ошибка компиляции по той причине, что не включен хедер <iostream>
(нет строки #include <iostream>).
Компилятор не знает о существовании инструкции печати.
test.cpp: In function ‘void A()’:test.cpp:3:10: error: ‘cout’ is not a member of ‘std’ 3 | std::cout << "Hello World"; | ^~~~test.cpp:1:1: note: ‘std::cout’ is defined in header ‘<iostream>’; did you forget to ‘#include <iostream>’? +++ |+#include <iostream> 1 | void A()Чтобы решить, нужно добавить #include <iostream> как первую строку.
7. Исправленная функция A
Заголовок раздела «7. Исправленная функция A»#include <iostream>
void A(){ std::cout << "Hello World." << std::endl;}Ответ
Произойдет ошибка компиляции, потому что нет функции main. см. 1
8. Функция main
Заголовок раздела «8. Функция main»#include <iostream>
int main(){ std::cout << "Hello World." << std::endl;}Ответ
Программа успешно скомпилируется:
- функция
mainопределена; - до использования
std::cout <<была включенаiostream.
При запуске напечатается “Hello World.”.
9. Функция Main
Заголовок раздела «9. Функция Main»#include <iostream>
int Main(){ std::cout << "Hello World." << std::endl;}Ответ
C++ чувствителен к заглавности букв в именах функций и в именах других сущностей.
Функции main нет, как и во втором вопросе.
10. COUT вместо cout
Заголовок раздела «10. COUT вместо cout»#include <iostream>
int main(){ std::COUT << "Hello World." << std::endl;}Ответ
Произойдет ошибка компиляции, потому что C++ чувствителен к заглавности букв:
cout нужно писать маленькими буквами.
COUT большими буквами это другое имя, а такого имени в std нет.
test.cpp: In function ‘int main()’:test.cpp:5:10: error: ‘COUT’ is not a member of ‘std’ 5 | std::COUT << "Hello World." << std::endl; | ^~~~11. Коммент
Заголовок раздела «11. Коммент»#include <iostream>
int main(){ // std::cout << "Hello" << std::endl; std::cout << "World" << std::endl;}Ответ
Напечатается лишь World.
Строка с печатью Hello “откомменчена” (// в начале) и не выполнится.
12. Коммент всего
Заголовок раздела «12. Коммент всего»int main(){ // std::cout << "Hello" << std::endl; // std::cout << "World" << std::endl;}Ответ
Скомпилируется без проблем.
Комментарии не участвуют в компиляции, следовательно,
компилятор даже не будет искать функцию std::cout <<.
При запуске ничего не выведется.
13. Функция вызывает функцию
Заголовок раздела «13. Функция вызывает функцию»#include <iostream>
void A(){ std::cout << "Hello World" << std::endl;}void B(){ A();}Ответ
Программа не скомпилируется, потому что функции main нет.
14. main вызывает функцию вызывает функцию
Заголовок раздела «14. main вызывает функцию вызывает функцию»#include <iostream>
void A(){ std::cout << "A" << std::endl;}void B(){ std::cout << "B-before" << std::endl; A(); std::cout << "B-after" << std::endl;}int main(){ B();}Ответ
Программа скомпилируется с успехом.
Порядок выполнения строк:
B(); // функцию вызвалиstd::cout << "B-before" << std::endl;A(); // функцию вызвалиstd::cout << "A" << std::endl;// A завершиласьstd::cout << "B-after" << std::endl;// B завершилась15. Почти та же ситуация
Заголовок раздела «15. Почти та же ситуация»Выявите, в чем отличие этого примера и предыдущего. Что изменилось, и изменится ли от этого исход?
#include <iostream>
void B(){ std::cout << "B-before" << std::endl; A(); std::cout << "B-after" << std::endl;}void A(){ std::cout << "A" << std::endl;}int main(){ B();}Ответ
Теперь программа не скомпилируется.
A(); в функции B находится в файле с кодом до определения функции A.
Вызов B(); в функции main не вызовет таких проблем, потому что
определение функции B находится в файле до ее вызова.
A должна быть определена в исходном файле до того, как ее вызывает B.
Практика
Заголовок раздела «Практика»-
Сделайте программу, которая печатает
"Jello"в консоль. -
Определите функцию
Aкоторая печатаетA. Вызовите ее в функцииmain.Подсказка
Определение функции подразумевает следующий синтаксис.
void A(){}Вызов функции выглядит вот так:
A();Определение функции должно находится до вызова функции. Следующий код не сработает:
int main(){A()}void A(){}Правильный код:
void A(){std::cout << "A";std::cout << std::endl;}int main(){A()} -
Определите 3 функции:
A,B,C.Aдолжна вызывать функцииBиC.A,B,Cвсе должны печатать сообщение, что они вызываются (то есть, дляA, будет"called A")