Перейти к содержимому

Базовый синтаксис: инструкции

  • Исходный файл
  • Компилирование и запуск программы
  • Инструкции программы
  • Порядок выполнения инструкций
  • Инструкция печати в консоль
  • Функции без параметров
  • Особая функция main
  • Тело функции
  • Пустая функция
  • Комментарии
  • Порядок определения инструкции программы

Что произойдет при компилировании этих отрезков кода? А при выполнении?

int main()
{
}
Ответ

Эта программа успешно скомпилируется.

Функция main автоматически запустится при запуске этой программы.

Сама функция не содержит инструкций в теле (пустые фигурные скобки). По этой причине, при выполнении main ничего не будет напечатано.

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>). Без этой строки, компилятор не знает о существовании инструкции печати.

#include <iostream>
int main()
{
std::cout << "Hello world";
std::cout << std::endl;
}
Ответ

Эта программа скомпилируется. При запуске выполнятся инструкции из функции main, печатая “Hello world”.

Что делает std::endl?

endl означает “end line” (end + line, конец строки). Он завершает текущую строку вывода (как нажатие Enter) и сбрасывает буфер вывода, чтобы вывод сразу появился на экране.

#include <iostream>
int main()
{
std::cout << "Hello world" << std::endl;
}
Ответ

Этот код эквивалентен следующему:

std::cout << "Hello world";
std::cout << std::endl;
void A()
{
}
Ответ

Программа ожидает, что существует функция main для удачной компиляции. Поскольку main нет, программа не скомпилируется (дав ошибку на фазе линкинга, о чем будет подробнее в одном из дальнейших уроков).

(.text+0x1b): undefined reference to `main'
collect2: error: ld returned 1 exit status

ld это название программы линкера.

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> как первую строку.

#include <iostream>
void A()
{
std::cout << "Hello World." << std::endl;
}
Ответ

Произойдет ошибка компиляции, потому что нет функции main. см. 1

#include <iostream>
int main()
{
std::cout << "Hello World." << std::endl;
}
Ответ

Программа успешно скомпилируется:

  • функция main определена;
  • до использования std::cout << была включена iostream.

При запуске напечатается “Hello World.”.

#include <iostream>
int Main()
{
std::cout << "Hello World." << std::endl;
}
Ответ

C++ чувствителен к заглавности букв в именах функций и в именах других сущностей. Функции main нет, как и во втором вопросе.

#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;
| ^~~~
#include <iostream>
int main()
{
// std::cout << "Hello" << std::endl;
std::cout << "World" << std::endl;
}
Ответ

Напечатается лишь World. Строка с печатью Hello “откомменчена” (// в начале) и не выполнится.

int main()
{
// std::cout << "Hello" << std::endl;
// std::cout << "World" << std::endl;
}
Ответ

Скомпилируется без проблем. Комментарии не участвуют в компиляции, следовательно, компилятор даже не будет искать функцию std::cout <<.

При запуске ничего не выведется.

#include <iostream>
void A()
{
std::cout << "Hello World" << std::endl;
}
void B()
{
A();
}
Ответ

Программа не скомпилируется, потому что функции 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 завершилась

Выявите, в чем отличие этого примера и предыдущего. Что изменилось, и изменится ли от этого исход?

#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")