Компиляция программы на языке C/C++:
![Компиляция программы на языке C++](../Pictures/02_01.%20Компиляция%20программы%20на%20языке%20C++.png)  
Простейшая программа на языке C/C++:
```cpp
int main() {
	return 0;
}
```
Любая программа на языке C состоит из одной или нескольких функций. Обязательно должна присутствовать функция `main`, с команд которой и начинается выполнение программы. Любая функция в первом приближении выглядит так:
```cpp
{
	тело функции;
}
```

Пример программы "Hello, world" на языке C:
```c
#include <stdio.h>
#include <iostream>

int main() {
	printf("Hello, world!\n");
	system("pause");
	return 0;
}
```
Пример программы "Hello, world" на языке C++:
```cpp
#include <iostream>
using namespace std;

int main() {
	cout << "Hello, World!\n";
	system("pause");
	return 0;
}
```
## Переменные и типы данных
**Данные** - это константы, переменные, выражения, значения функций, с которыми оперирует программа.  
**Переменная** - ячейка в памяти компьютера, которая имеет имя и хранит некоторое значение.  Значение переменной может меняться во время выполнения программы. При записи в ячейку нового значения старое стирается.  
**Тип данных** - это те значения, которые данные могут принимать, + операции, которые с этими значениями допустимы.  
![Хранение переменной в памяти](../Pictures/02_02.%20Хранение%20переменной%20в%20памяти.png)  
#### Простые типы данных
- **bool**: true, false (1 байт)
- **int**: $-2^{31}$; $2^{31}$ (4 байта)
- **char**: 0; 255 (1 байт)
- **float**: $3.4∗10^{-38}$; $3.4∗10^{38}$ (4 байта)
- **double**: $1.7∗10^{-308}$; $1.7∗10^{-200}$ (8 байт)
## Ввод-вывод данных в языке C
Функция вывода:
```c
int printf(const char* format, arg-list)
```
Пример:
```c
printf("Hi %s %d %c", "with", 26, 'u');
```

| Формат | Значение                    |
| ------ | --------------------------- |
| `%d`   | Вывод целого числа          |
| `%f`   | Вывод действительного числа |
| `%c`   | Вывод одного символа        |
| `%s`   | Вывод строки символов       |
| `\n`   | Перевод строки              |
  
Функция вывода `printf` первым обязательным параметром включает в себя строку, все символы которой, кроме управляющих, выводятся в консольное окно. Управляющие символы либо задают тип данных в следующем листе аргументов, либо управляют выводом на консоль (перевод строки, табуляция и т. д.). Аргументы, указанные после строки формата, будут выводиться в том месте строки, где указан их формат.
```c
#include <iostream>
using namespace std;
int main() {
	char a = 'A', b = 'B', c = a + b;
	printf("Hello, world!\n");
	system("pause");
	return 0;
}
```
  
```c
#include <iostream>
using namespace std;
int main() {
	char a = 'A', b = 'B', c = a + b;
	printf("Hello,\n%s\n", "world!");
	system("pause");
	return 0;
}
```
  
```c
#include <iostream>
using namespace std;
int main() {
	char a = 'A', b = 'B', c = a + b;
	printf("Hi %s %d %c\n", "with", 26, 'u');
	system("pause");
	return 0;
}
```
Функция ввода:
```c
int scanf(const char* format, arg-list)
```
Пример:
```c
scanf("%d%c", &a, &c);
```

| Формат | Значение                   |
| ------ | -------------------------- |
| `%d`   | Ввод целого числа          |
| `%f`   | Ввод действительного числа |
| `%c`   | Ввод одного символа        |
| `%s`   | Ввод строки символов       |
  
В строке формата указываются типы данных всех переменных из списка аргументов. Вместо имен переменных указываются адреса ячеек памяти, относящихся к каждой переменной. Операция взятия адреса - `&` (амперсанд).
```c
#include <iostream>
using namespace std;
int main() {
	int a, b;
	printf("a = "); scanf("%d", &a);
	printf("b = "); scanf("%d", &b);
	printf("a * b = %d\n", a * b);
	system("pause");
	return 0;
}
```
## Поточный ввод-вывод в C++
`cin` - стандартный входной поток.  
`cout` - стандартный выходной поток.  
Операции:
- `>>` - получить из входного потока
- `<<` - поместить в выходной поток
```cpp
#include <iostream>
cout << 'значение 1' << 'значение 2' << ... << 'значение n';
cin << 'переменная 1' << 'переменная 2' << ... << 'переменная n';
```
В C++ с вводом-выводом связано понятие потока байтов, и для любого устройства (консоль, файл, сетевой канал и др.) этот поток выглядит одинаково. Поэтому определены всего 2 операции для любого потока. С консолью связаны потоки `cin`-`cout`, которые программно являются объектами, а значит к ним применимы их методы, вызываемые через точку.
```cpp
#include <iostream>
using namespace std;
int main() {
	int a, b;
	cout << "a = "; cin >> a;
	cout << "b = "; cin >> b;
	cout << "a * b = " << a * b << endl;
	system("pause");
	return 0;
}
```
## Операции в языке C
| Операция                                   | Назначение                          |
| ------------------------------------------ | ----------------------------------- |
| `!`                                        | Логическое отрицание                |
| `++`                                       | Инкремент                           |
| `--`                                       | Декремент                           |
| `&`                                        | Взятие адреса (`&a`)                |
| `*`                                        | Обращение по адресу (`a*`)          |
| `(тип)`                                    | Преобразование типа                 |
| `sizeof()`                                 | Размер в байтах                     |
| `*`                                        | Умножение                           |
| `/`                                        | Деление                             |
| `%`                                        | Остаток от деления                  |
| `+`                                        | Сложение                            |
| `-`                                        | Вычитание                           |
| `<<`, `>>`                                 | Битовые сдвиги влево и вправо       |
| `<`, `>`, `<=`, `>=`, `==`, `!=`           | Логические операции сравнения       |
| `&&`                                       | Логическое И                        |
| `\|`                                       | Логическое ИЛИ                      |
| `?`                                        | Условная операция                   |
| `=`                                        | Присваивание                        |
| `+=`, `-=`, `*=`, `/=`, `%=`, `<<=`, `>>=` | Бинарные операции                   |
| `.`                                        | Обращение к полям и методам объекта |
```cpp
#include <iostream>
using namespace std;
int main() {
	int a = 5;
	cout << a++ << endl;
	cout << a << endl;
	
	cout << 2 / 3.0 << endl;
	cout << (double)2/3 << endl;
	
	a = 5;
	a *= 10;
	cout << a << endl;
	
	a = 5;
	a <<= 3;
	cout << a << endl;
	
	system("pause");
	return 0;
}
```
Битовые сдвиги:
![Битовые сдвиги](../Pictures/02_03.%20Битовые%20сдвиги.png)
## Стандартные математические функции
| Математическая функция        | ID функции в C |
| ----------------------------- | -------------- |
| $\sqrt{x}$                    | `sqrt(x)`      |
| $\|x\|$                       | `fabs(x)`      |
| $e^x$                         | `exp(x)`       |
| $x^y$                         | `pow(x, y)`    |
| $\ln{(x)}$                    | `log(x)`       |
| $\lg{(x)}$                    | `log10(x)`     |
| $\sin{(x)}$                   | `sin(x)`       |
| $\cos{(x)}$                   | `cos(x)`       |
| $tg\ (x)$                     | `tan(x)`       |
| $\arcsin{(x)}$                | `asin(x)`      |
| $\arccos{(x)}$                | `acos(x)`      |
| $arctg\ (x)$                  | `atan(x)`      |
| $sh\ (x) = 0.5(e^x-e^{-x})$   | `sinh(x)`      |
| $ch\ (x) = 0.5(e^x+e^{-x})$   | `cosh(x)`      |
| $tgh\ (x)$                    | `tanh(x)`      |
| Остаток от деления $x$ на $y$ | `fmod(x)`      |
| Наименьшее целое $>=x$        | `ceil(x)`      |
| Наибольшее целое $<=x$        | `floor(x)`     |
## Последовательность вычисления арифметических выражений
Сначала вычисляются значения всех функций и выполняются действия в скобках. Затем умножение и деление в порядке их следования. Наконец, сложение и вычитание, также в порядке следования:
```cpp
10 / 2 * 5 = 25
10 / (2 * 5) = 1
```
