Массивы в Си
Массив в ОЗУ занимает непрерывный блок (без разрывов).
В C/C++ нумерация массива начинается с нуля: a — 1-ый элемент, a — последний. В Си нет контроля выхода за пределы массива! Типичный цикл:
В С нет встроенной поддержки динамических массивов, но есть ф-ции управления динам. памятью.
— Одномерный массив: тип имя_массива ;
тогда общее число байт = sizeof(тип)*размер
— Многомерный массив: тип имя_массива …;
— с инициализацией: тип имя_массива … = {список значений};
пр.:
тоже самое что:
В случае инициализации можно не указывать размер массива (посчитает автоматически):
(строка — это массив типа char)
Индексация указателей:
Имя массива есть адрес первого элемента массива!!! Примеры:
Обращение по указателями быстрее, чем по индексации массивов, в случае последовательного доступа к массиву. Если же обращение случайным образом, то лучше использовать индексацию.
Пример.
Передача массивов в функции.
Два способа:
1) с индексированием:
2) с помощью указателя:
3) комбинированные варианты:
ОДНАКО между указателями и массивами есть 2 большие разницы:
— имя массива есть указатель-константа, т. е. нельзя изменить его значение;
— при определении массива под него резервируется блок памяти.
Указатель можно настроить на блок памяти 2-мя способами:
— под ранее выделенный блок памяти;
— выделить память динамически из кучи (выделяется ына этапе выполнения программы).
Динамические массивы
Создание динамического массива (использует свободную память, называемую кучей). Функции библиотеки
(здесь size_t — тип для измерения размера памяти для данной платформы).
void *malloc (size_t число_байт); — выделение памяти и возврат указателя типа void*; возвращает NULL в случае ошибки.
void *сalloc (size_t кол-во_блоков, size_t число_байт); — выделяет nitems*size байт и кроме того выполняется очистка памяти (обнуление).
void *realloc( void *block, size_t newsize ); — изменяет первоначальный размер выделенного блока (при необходимости осуществляется перенос данных в новое место в памяти).
void free (void *p); — возвращает выделенную память в кучу, где p — указатель на блок (важно, чтобы этот указатель был таким же как при выделении памяти! поэтому его желательно сделать const).
Пример:
Замечание про C++:
С++ (в отличии от С) не поддерживает автоматического преобразования типов. Поэтому в С++ надо:
В С++ рекомендуется использовать new.
Строки как массивы
Примеры:
Здесь p — указатель на константную строку. Сама строка хранится в сигменте данных (read only). Слово const защищает от попытки записать в что-то в эту строку (иначе возможна ошибка при выполнении).
Общая структура программы на Си и функция main()
Структура программы:
1. Директивы (#include)
2. Функция main();
3. Описание локальных переменных (в языке «С» лок. переменные должны идти перед инструкциями, но в С++ рекомендуется объявлять переменные в месте их использования).
4. Исполняемые инструкции.
5. Оператор завершения: return 0; (хотя компилятор Си сам добавляет return 0; автоматически) — под ОС.
Функция main()
В программе должна быть ровно одна функция main().
-1) программа под управлением ОС.
В стандарте описано всего две перегруженных функции main:
Не правильно писать main(void), т. к. ОС передает некоторые параметры.
При этом ф-ция main() должна возвращать некоторые значение — код возврата, передаваемый операционной системе, с помощью оператора return.
-2) программа для микроконтроллера:
Здесь пишется main(void), т.к. ОС там нет.
Переменные
Переменная — идентификатор, представляющий собой изображение изменяемого объекта. C технической точки зрения, переменная — это область памяти, в которую могут помещаться различные значения.
Любая переменная до ее использования в программе на языке Си должна быть объявлена, то есть для нее должны быть указаны тип и имя (идентификатор).
Объявление переменных в Си осуществляется в формеТипПеременной ИмяПеременной;
Каждую переменную можно снабдить комментарием, поясняющим ее смысл. Например,
int i; // счетчик циклов
int i, n;
ТипПеременной ИмяПеременной=значение;
123
int i=0, k, n, m=1;float pi=3.1415, y;char a=’a’;
Язык Си
Операции и операторы
Оператор (инструкция, англ. statement) — это единица выполнения программы.
В языке Си любое выражение, заканчивающееся символом «точка с запятой» (;), является оператором.
Фигурные скобки { } — это составной оператор.
Например,
Кроме того { } является отдельным блоком и в нем можно определять локальные переменные.
; — пустой оператор.
Операции:
— Арифметические операторы: — + * / %
— Инкрименты и декрименты: ++a, —a, a++, a— (могут выполняться быстрее)
— Операторы сравнения (отн-ний): > >=
— Логические операторы: && || ! (возвращают 1 или 0)
— Битовые операторы: & | ^ ~ >>
— Оператор ?: x ? y : z, напр.: r = 10>9 ? 100 : 200
— sizeof — унарный оператор для вычисления размера переменной или типа
— , — оператор запятая (последовательное вычисление): a = (b=3, b+2);
Порядок выполнения операторов:
— Унарные операторы выполняются справа-налево.
— Бинарные выполняются слева-направо.
— Присваивание выполняется справа-налево.
Порядок можно менять с помощью скобок!
Примеры:
Выражение а + b + c интерпретируется как (а + b) + с.
sizeof() — возвращает длину в байтах переменной или типа; sizeof(int); sizeof(a);
sizeof выражение; — само выражение не вычисляется.
Оператор запятая:
левая сторона оператора вычисляется как void и не выдаёт значения, переменной x присвается значение выражения в правой стороне, т.е. y+1.
Использование символьных констант в программе
Во многих программах символьные константы используются часто (в разных местах кода). Это могут быть физические или математические константы (например, число Пи или число Авогадро), или специфические значения в вашей программе. Чтобы не писать их каждый раз, когда они необходимы — просто определите их в одном месте и используйте везде, где они нужны. Таким образом, если вам придется изменить их значения — достаточно будет зайти в один файл и внести в него правки, а не искать эти константы по всей программе.
Алгоритм использования символьных констант в вашей программе:
Шаг №1: Создайте заголовочный файл для хранения констант.
Шаг №2: В заголовочном файле объявите пространство имен.
Шаг №3: Добавьте все ваши константы в созданное пространство имен (убедитесь, что все константы имеют спецификатор ).
Шаг №4: #include заголовочный файл везде, где нужны константы.
Например, файл constants.h:
#ifndef CONSTANTS_H
#define CONSTANTS_H
// Определите собственное пространство имен для хранения констант
namespace constants
{
const double pi(3.14159);
const double avogadro(6.0221413e23);
const double my_gravity(9.2);
// … другие константы
}
#endif
1 |
#ifndef CONSTANTS_H // Определите собственное пространство имен для хранения констант namespaceconstants { constdoublepi(3.14159); constdoubleavogadro(6.0221413e23); constdoublemy_gravity(9.2); // … другие константы } |
Используйте оператор разрешения области видимости для доступа к константам в файлах .cpp:
#include «constants.h»
//…
double circumference = 2 * radius * constants::pi;
//…
1 |
#include «constants.h» doublecircumference=2*radius *constants::pi; //… |
Если в программе много констант разных типов, то сделайте отдельные файлы для каждого из этих типов. Таким образом, отделив математические константы от специфических значений (которые могут быть разными в разных программах), вы сможете подключать файл с математическими константами к любой другой программе.
Переменные (ключевые слова var, let и const)
Переменная – это именованный участок памяти для хранения данных.
Представить себе переменную можно как некоторую область памяти, в которую вы можете как записать некоторую информацию, так и прочитать её из неё. Доступ к этому месту в памяти выполняется по имени, которое вы установили переменной при её создании.
Данные, хранящиеся в переменной, называются её значением.
В процессе выполнения программы значения переменной могут меняться. Но в определённый момент времени переменная всегда имеет какое-то одно значение.
В JavaScript до ES6 (ECMAScript 2015) объявление (создание) переменных осуществлялось с использованием только ключевого слова .
// объеявление переменной message (message - это имя переменной) var message;
При создании переменной ей сразу же можно присвоить некоторое значение. Эту операцию называют инициализацией переменной.
Присвоение переменной значения выполняется через оператор .
// например, создадим переменную email и присвоим ей в качестве значения строку "[email protected]" var email = '[email protected]'; // установим переменной email новое значение email = '[email protected]';
Для того чтобы получить значение переменной к ней нужно просто обратиться по имени.
// например, выведем в консоль браузера значение переменной email console.log(email);
Переменная, которая объявлена без инициализации имеет по умолчанию значение .
var phone; // например, выведем в консоль браузера значение переменной phone console.log(phone); // undefined
Для того чтобы объявить не одну, а сразу несколько переменных с помощью одного ключевого слова , их необходимо просто отделить друг от друга с помощью запятой.
// например, объявим с помощью одного ключевого слова var сразу три переменные, и двум из них сразу присвоим значения var price = 78.55, quantity = 10, message;
Объявление переменных с помощью let и const
Сейчас ключевое слово практически не используется, вместо него новый стандарт (ES6) рекомендует использовать и .
В чем отличия от ?
1. Переменная объявленная посредством имеет область видимости, ограниченную блоком. Т.е. она видна только внутри фигурных скобок, в которых она создана, а также в любых других скобках, вложенных в эти. Вне них она не существует.
{ let name = 'John'; console.log(name); // "John" { console.log(name); // "John" } } console.log(name); // Uncaught ReferenceError: name is not defined
Переменная, объявленная через ключевое слово имеет функциональную область видимости. Т.е. она ограничена только пределами функции.
Такая переменная будет видна за пределами блока, в котором она создана.
{ var name = 'John'; console.log(name); // "John" { console.log(name); // "John" } } console.log(name); // "John"
2. Переменные, созданные с помощью не поднимаются к началу текущего контекста, т.е. hoisting для них не выполняется. Другими словами, к такой переменной нельзя обратиться до её объявления.
age = 10; // ReferenceError: Cannot access 'age' before initialization let age = 28;
Переменные, созданные с помощью поднимаются к началу текущего контекста. Это означает что к таким переменным вы можете обратиться до их объявления.
age = 10; var age = 28;
Константы (const)
Мы разобрали отличия от . А что же насчёт ? Переменные, созданные с помощью ведут себя также как с . Единственное отличие между ними заключается в том, что непосредственное значение переменной созданной через вы не можете изменить. Таким образом, – это ключевое слово, предназначенное для создания своего рода констант.
const COLOR_RED = '#ff0000';
Именование констант рекомендуется выполнять прописными буквами. Если константа состоит из несколько слов, то их между собой желательно отделять с помощью нижнего подчёркивания.
При попытке изменить значение константы вам будет брошена ошибка.
const COLOR_RED = '#ff0000'; COLOR_RED = '#f44336'; // Uncaught TypeError: Assignment to constant variable.
Когда переменной вы присваиваете значение, имеющее объектный тип данных, в ней уже будет храниться не сам этот объект, а ссылка на него. Это необходимо учитвать при работе с переменными в JavaScipt.
В этом случае когда вы константе присваиваете некий объект, то вы не можете изменить ссылку, хранящуюся в самой константе. Но сам объект доступен для изменения.
const COLORS = ; // присвоить другой объект или значение константе нельзя COLORS = []; // Uncaught TypeError: Assignment to constant variable. COLORS = { red: '#ff0000', green: '#00ff00', blue: '#00ff00' }; // Uncaught TypeError: Assignment to constant variable. COLORS = '#00ff00'; // Uncaught TypeError: Assignment to constant variable // но имзменить сам объект можно COLORS.push('#4caf50'); console.log(COLORS); //
Типы переменных в языке C#
Начнем со знакомства с наиболее часто используемыми типами данных (большинство их них значимые):
Имя | Класс | Описание | Пример |
int | Int32 | Целое число со знаком | -2147483648, -1, 0, 1, 2147483647 |
double | Double | Число с плавающей запятой | -12.34, -1.1, 0, 1, 53.6123123 |
char | Char | Символ | ‘a’, ‘b’, ‘1’, ‘+’, ‘\t’, ‘_’ |
bool | Boolean | Логическое значение | true, false |
decimal | Decimal | Число с фиксированной запятой | -123.2M, -1, 0, 1.10M |
string | String | Строка (ссылочный тип) | “hello”, “a”, “11”, “+++”, “” |
object | Object | Базовый класс (ссылочный тип) | Вообще все в C# |
Это самые распространенные и часто используемые типы данных, но это далеко не все типы. В таблице ниже приведены типы данных, которые используют в тех случаях, когда необходимо заботиться о быстродействии и потреблении системных ресурсов.
Имя | Класс | Описание | Пример |
sbyte | SByte | Маленькое целое число со знаком | -128, -1, 0, 1, 127 |
byte | Byte | Маленькое целое число без знака | 0, 1, 255 |
uint | UInt32 | Целое число без знака | 0, 1, 4294967295 |
long | Int64 | Большое целое число со знаком | -9223372036854775808, -1, 0, 1, 9223372036854775807 |
ulong | UInt64 | Большое беззнаковое целое число | 0, 1, 18446744073709551615 |
float | Single | Маленькое число с плавающей запятой | -1.1F, 0, 1.001F |
Надеюсь, ты заметил, что для типов float и decimal при дробном числе добавляется специальная литера (F и M соответственно). Это связано с тем, что по умолчанию в C# дробные числа хранятся в типе double, а это необходимо для того, чтобы компилятор правильно воспринимал эти числа. Для целых значений это не обязательно.
Курсы по Data Science, SQL и анализу данных (ТОП-7)
№7. Профессия Data Scientist: машинное обучение от Skillbox
Цена: 115 000 рублей, или 69 000 рублей со скидкой.
Продолжительность: 13 месяцев.
Сертификат/диплом: диплом, после защиты.
Формат обучения: просмотр видеоуроков + выполнение заданий в удобном темпе + работа с экспертом + защита диплома.
№6. Профессия Data Analyst от SkillFactory
Цена: 254 988 рублей, со скидкой — 191 250 рублей.
Продолжительность: 18 месяцев.
Сертификат/диплом: сертификат школы.
Формат обучения: изучение востребованных навыков + сбор кейсов в портфолио + тренажеры с практикой + прокачка soft skills.
№5. Курс SQL и получение данных от Нетологии
Цена: полная цена 23 900 рублей, со скидкой — 19 100 рублей.
Продолжительность: 1 месяц.
Сертификат/диплом: удостоверение о повышении квалификации.
Формат обучения: изучение теории + домашние задания + консультации + подготовка к собеседованию + подбор вакансий.
№4. Профессия Data Scientist от SkillFactory
Цена: 540 000 рублей без скидки, 405 000 рублей со скидкой.
Продолжительность: 24 месяца.
Сертификат/диплом: сертификат SkillFactory.
Формат обучения: теория + обучение в игровой форме + практика + тренажер + тесты и интерактивные задания + развитие soft skills.
№3. Профессия специалист по Data Science от Яндекс.Практикум
Цена: 90 000 рублей единоразовым платежом, 104 000 рублей при рассрочке.
Продолжительность: 8 месяцев.
Сертификат/диплом: диплом.
Формат обучения: практика + тренажер + поддержка команды наставников.
№2. Факультет Аналитики Big Data от GeekBrains
Цена: 270 000 рублей, или 162 000 рублей со скидкой.
Продолжительность: 18 месяцев.
Сертификат/диплом: сертификат + диплом.
Формат обучения: работа над реальными проектами + помощь наставников + основательная математическая подготовка + курсы вне четверти.
№1. Профессия Data Scientist от Skillbox
Цена: 232 500 рублей, или 116 250 рублей со скидкой.
Продолжительность: 18 месяцев.
Сертификат/диплом: да, выдаётся после защиты.
Формат обучения: видеоуроки + домашка + работа с наставником + итоговая дипломная работа + бонусные курсы (универсальные знания программиста и английский для IT-специалиста).
Структуры, объединения, перечисления
Структуры (struct)
Описание (объявление структуры:
Определение структры, т. е. выделение памяти:
Можно, но не рекомендуется (для больших проектов) совмещать описание и определение переменных:
Можно создать псевдоним
и затем писать короче:
Или сразу с псевдонимом:
Определение с инициализацией:
Доступ к элементам структуры — с помощью операции точка (.):
Указатель на структуру:
Доступ через указатель с помощью операции ( -> ):
Битовые поля
Битовое поле — это специальный тип структуры, который определяет, какой будет длина в битах каждого элемента структуры.
В С битовое поле может рассматриваться:
— как целое со знаком — signed int (по умолчанию просто int),
— или без знака — unsigned int.
Битовые поля длиной 1 должны объявляться как unsigned, поскольку 1 бит не может иметь знака.
Пример:
Объединения (union)
Предназначены для хранения нескольких переменных разных типов в (точнее совпадает адрес начала):
Здесь выделяется 4 байта под pw, символ ch помещается в байт номер 0, int занимает 4 байта.
Перечисления (enum)
Перечисление — это набор именованных целочисленных констант, определяющих все допустимые значения, которые может принимать переменная:
По умолчанию, целые значения присваиваются элементам перечисления в возрастающем порядке, начиная с нуля. Имя не обязательно. Пример:
ЗАМЕНА ВЫРАЖЕНИЙ МАКРОКОМАНДАМИ
Если ваши программы выполняют реальные вычисления, то в общем случае ваш код будет содержать сложные выражения типа:
В данном случае программа вычисляет куб выражения (х*у-3). Чтобы улучшить читаемость вашей программы и уменьшить вероятность внесения ошибок из-за опечаток, создайте макрокоманду с именем CUBE, которую ваша программа может использовать следующим образом:
И опять общепринятым среди программистов считается использование больших букв для имен макрокоманд, чтобы отличить их от функций.
Для создания макрокоманды вы должны использовать директиву препроцессора # define. Например, следующий оператор создает макрокоманду CUBE:
Как видите, программа определяет макрокоманду CUBE для умножения параметра х на самого себя дважды. Следующая программа SHOWCUBE.CPP использует макрокоманду CUBE для вывода куба значений от 1 до 10:
При компиляции этой программы препроцессор C++ заменит каждый экземпляр макрокоманды CUBE соответствующим определением. Другими словами, замена макрокоманды препроцессором приведет к следующему коду:
Обратите внимание, что предыдущая макрокоманда поместила параметр х внутрь круглых скобок, использовав запись ((х)*(х)*(х)) вместо (х*х*х).При создании макрокоманд вы должны помещать параметры в круглые скобки, как показано выше, тогда можете быть уверены, что C++ трактует ваши выражения именно так, как вы хотите. Как вы помните из урока 5, C++ использует старшинство операций для определения порядка выполнения арифметических операций
Предположим, например, что программа использует макрокоманду CUBE с выражением 3+5-2, как показано ниже:
Если макрокоманда заключает свой параметр в круглые скобки, то препроцессор сгенерирует следующий оператор:
Однако, если в определении макрокоманды опустить круглые скобки, препроцессор сгенерирует следующий оператор:
Если вы вычислите оба выражения, то обнаружите, что их результаты отличаются. Заключая аргументы макрокоманды в круглые скобки, вы избавитесь от подобных ошибок.
ИСПОЛЬЗОВАНИЕ МАКРОКОМАНД ПРЕДОСТАВЛЯЕТ БОЛЬШУЮ ГИБКОСТЬ
Вы можете использовать макрокоманды в своих программах различным образом. Однако имейте в виду, что цель использования макрокоманд состоит в упрощении кодирования и улучшении восприятия ваших программ. Следующая программа MACDELAY.CPP иллюстрирует гибкость макрокоманд. Кроме того, эта программа поможет вам лучше представить, как препроцессор заменяет имя макрокоманды соответствующими операторами:
В данном случае, поскольку определение макрокоманды занимает несколько строк, это определение помещает один символ обратного слэша (\) в конце каждой строки, которая имеет продолжение. Когда препроцессор встретит ссылку на макрокоманду, он заменит эту ссылку операторами, которые появляются в определении макрокоманды.
🎮 Курсы по разработке игр
Специальность GameDev – сокращение от game development (разработка игр). Само это название говорит, что в задачу такого работника входит создание компьютерных видеоигр. Он должен уметь передавать движение персонажей, их действия, вставлять звуковое сопровождение, программировать результат в зависимости от совершаемых игроком действий. Конкуренция на рынке видеоигр очень высока, поэтому хорошее образование и креативность необходимы в этой сфере для успешной карьеры.
Игры, как правило, не разрабатываются с нуля, игровой программист должен знать устройство игровых движков и уметь их использовать. Полученное образование по игровому программированию, а также хорошо заполненный портфолио и знание основ программирования, помогут занять место в компаниях, занимающихся разработкой развлечений для геймеров. Образовательные интернет-платформы предлагают разнообразные курсы по обучению искусству игрового программирования.
Профессия «Разработчик игр на Unity» от SkillFactory
Срок обучения – 12 месяцев.
На этом курсе обучают работать с движком Unity, на котором выстраивается большинство игр. Также учащиеся получат навыки в языке программирования Си-Шарп (C#). Здесь помогут научиться создавать игры в разных жанрах – стратегиях, квестах, аркадах, шутерах, гонках и т.п. Преподаватели покажут, как определять цель и задачи игры, какие этапы есть в разработке, как продвигать и продавать свои игры. На курсе обучают созданию игр в двух и трехмерной графике. В ходе обучения слушателем курса разрабатываются четыре игры, которые включаются в портфолио.
Варианты оплаты:
- Полная стоимость обучения: 180 000 рублей.
- Стоимость со скидкой: 117 000 рублей.
- Помесячная рассрочка: 4875 рублей.
️ Перейти на сайт курса
Профессия «Разработчик игр на Unity» от онлайн-школы Нетология
Срок обучения – 9 месяцев.
Этот курс подойдет начинающим гейм-разработчикам. Учащиеся осваивают движок Unity и язык Си Шарп, получают необходимые для профессиональной деятельности сведения по разработке интерфейса игры, ее персонажей, ландшафтов, «массовки», анимации действий. На курсе обучат адаптировать игры под системы Андроид, iOS, операционные системы компьютеров. В ходе обучения будут разработаны шесть игр – карточная, аркадная, ролевая, беговая (раннер), гиперказуал, танки 2D. Выпускнику предоставляется стажировка в проектах Нетологии, либо ее партнеров (Билайн, Рамблер, Mail.ru), бонусный курс по софт-скиллам.
Варианты оплаты:
- Полная стоимость обучения: 119 900 рублей.
- Стоимость со скидкой: 59 950 рублей.
- Помесячная рассрочка: 3330 рублей.
️ Перейти на сайт курса
Типы данных в Си
-Базовые типы данных: char, int, float, double.
-Модификаторы знака: signed, unsigned.
-Модификаторы знака: long, short.
void — тип без значения
При этом следущие типы равны:
В Си логический тип реализован неявно (с помощью int): false = нуль, true = не нуль.
Введение псевдонимов для ранее описанных типов данных:
typedef тип имя
где тип — любой существующий тип данных, имя — новое имя для этого типа.
Пример: typedef unsigned char byte;
Преобразование типов:
Если операнды операции имеют разные типы, то происходит неявное приведение типов:
(чтобы здесь получить 0.4 нужно было бы написать x=2.0/5 или 2/5.0)
Явное приведение типов:
Принудительное преобразование типов:
(тип) выражение;
(желательно вообще избегать преобразования типов)
Переменные и константы
Переменная представляет собой блок памяти, на который мы ссылаемся по её имени (идентификатору).
Декларация переменных (вместе с инициализацией):
тип идентификатор = инициатор;
Например,
Здесь «;» — составляющая часть конструкции, завершающая часть.
Допустима (хотя и редко используется) запись: const x = 100; (по умолчанию int).
Квалификаторы (или «модификаторы доступа»): const, volatile.
const — означает, что переменные не могут изменяться во время выполнения программы; инициалиировать можно только при декларации;
volatile — содержимое переменной может измениться само собой (используется в многопоточных программах при взаимодействии процессов)
Возможен вариант const volatile, когда писать могут только снаружи.
Спецификторы хранения (описатель класса памяти): auto, register, extern, static.
auto — локальные переменных (по умолчанию) — программный стек.
register — просьба компилятору положить переменную в регистр ЦПУ (но он эту просьбу редко выполняет);
extern — объявление (declaration) переменных, но не определение (definition) (определение где-то в другом месте); определение может идти ниже по файлу (но как глобальная) или в другом файле.
static — статические локальные переменные, которые хранят своё значение между вызовами функций (они предпочтильнее, чем глобальные переменные). Статические глобальные переменные видны только в пределах данного файла.
—
Внешние и статические объекты существуют и сохраняют свои значения на протяжении всего времени выполнения программы.
Автоматические и регистровые объекты создаются и существуют только внутри блока, в котором они описаны, и уничтожаются при выходе из этого блока.
Описание области действия идентификаторов (имен):
— внутреннее (локальное) — внутри блока {…}
— внешнее (глобальное) — вне всех блоков
Идентификатор, описанный внутри блока, известен только в этом блоке (локальный идентификатор).
Идентификатор, описанный на самом внешнем уровне, известен от места появления этого описания до конца входного файла, в котором он описан (глобальный идентификатор).
Стоит избегать использования глобальных имен.
Переменные с классом памяти static видны только в пределах текущего блока (для локальных) или в пределах файла (для объявленных глобально).
Статические переменные хранятся в сегменте данных (data) и по умолчанию инициализируются нулем. Т.е. память под static-переменные выделяется при старте программы и существует до конца программы.
Замечание: Инициализация выполняется одни раз при выделении памяти!
Статическими могут быть также функции. Такая ф-ция может исп-ся только внутри данного файла.
Следует различать присваивание и инициализацию:
— Присваивание: имя_переменной = выражение;
— Многочисленное присваивание: x = y = z = 0;
— Инициализация переменных: тип имя_переменной = константа;
Константы
Константы являются частью машинных команд и под них память не выделяется.
Константы бывают:
— целые:
10-я система: 127; -127; +127;
8-я система: 0127; (начинается с нуля — значит 8-ричная!)
16-я система: 0x7F; (x или X, f или F — регистр не влияет)
— вещественные: 3.14; 2. ; .25 (0 можно опускать); 2E3; 2e3; 2E-3; 2.0E+3;
— символьные: 8-битные ASCII: ‘A’, ‘=’, ‘\n’, ‘\t’, ‘\370’, ‘\xF8’ (символ градуса);
— строковые литералы (в двойных кавычках): «Hello, world!\n». Строки заканчиваются нулевым байтом — ‘\0’.
Макроопределения:
ИСПОЛЬЗОВАНИЕ ИМЕНОВАННЫХ КОНСТАНТ ДЛЯ УПРОЩЕНИЯ ИЗМЕНЕНИЯ КОДА
Кроме того, что именованные константы делают вашу программу легче для восприятия, они еще и облегчают модификацию программ. Например, следующий фрагмент кода несколько раз ссылается на число 50 (количество студентов в классе):
Предположим, например, что количество студентов в классе увеличилось до 55. В этом случае вы должны отредактировать предыдущую программу, чтобы заменить каждый экземпляр значения 50 значением 55. В следующей программе применен другой подход, она использует именованную константу CLASS_SIZE:
В данном случае для изменения количества студентов во всей программе вам необходимо изменить только одну строку, которая содержит директиву #define, определяющую эту константу:
Какова стоимость курса?
Я всегда, когда назначаю цену курса, смотрю, сколько он в денежном эквиваленте может вернуть, если применять знания из него на практике.
Для того, чтобы понять ценность знаний по языку С++, давайте посмотрим, сколько получают начинающие C++-программисты без стажа:
С опытом работы резко растёт зарплата:
Как видите, уровень зарплат у опытных программистов весьма высокий. И, кстати, для тех, кто хочет переехать в другую страну, C++ – это очень хороший вариант. Так как очень много высокооплачиваемых вакансий есть и за границей.
Поэтому ценность знаний по C++ крайне сложно переоценить. Объективно цену за курс можно было бы поставить и в 50 000 рублей. Ведь после прохождения курса Вы бы за месяц работы стажёром отбили бы его полную стоимость. И, кстати, многие мои «коллеги» так и делают. Вот некоторые скриншоты с ценами на обучение C++:
Как видите, цены очень высокие. Но я уже выше объяснял причину таких цен, поэтому повторяться не буду.
У меня совершенно другая ценовая политика. Реклама у меня не масштабная, поэтому много денег не тратится. Расходов на преподавателя нет, так как сам преподаю. И живу я за счёт постоянных клиентов. При выходе нового курса я всегда получаю минимум несколько сотен заказов просто по своей аудитории подписчиков и клиентов, и небольшая цена, помноженная на несколько сотен, превращается во вполне приличные деньги, на которые я могу достойно жить. А ведь курс продаётся и дальше, и это ещё больше продаж.
Поэтому я беру не большим средним чеком, как другие, а именно количеством клиентов и их постоянностью. Мне кажется, это самый справедливый и правильный вариант для всех. И Вы платите мало, и при этом я получаю очень приличную оплату за свой труд.
Нужно ли знать C++?
Однозначно, да!
Освоение C++ — этого своего рода посвящение в стан программистов. Даже при устройстве на работу PHP-разработчиком, если есть знание ещё и C++, то это является огромным козырем при устройстве на работу. Это подчёркивает, что соискатель действительно грамотный и понимает основы, а не просто научился машинально HTML-формы обрабатывать.
Так же есть огромное количество вакансий, где напрямую требуются C++ программисты. Кстати, конкуренция среди них достаточная низкая, а зарплата, как следствие, высокая, поскольку хороших C++ разработчиков найти сложно (в отличие от тех же PHP-программистов).
В конце концов, если интересно создание драйверов, операционных систем, компьютерных игр, то здесь без C++ никуда.