Виды переменных в c: Введение в язык Си

Содержание

Типы данных в языке Си : целые, вещественные, символьные

 

Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и способ реализации хранения значений и выполнения операций.

Процесс проверки и накладывания ограничений на типы используемых данных называется контролем типов или типизацией программных данных. Различают следующие виды типизации:

  • Статическая типизация — контроль типов осуществляется при компиляции.
  • Динамическая типизация — контроль типов осуществляется во время выполнения.

Язык Си поддерживает статическую типизацию, и типы всех используемых в программе данных должны быть указаны перед ее компиляцией.

Различают простые, составные и прочие типы данных.

 

Простые данные

Простые данные можно разделить на

  • целочисленные,
  • вещественные,
  • символьные
  • логические.

 

Составные (сложные) данные

  • Массив — индексированный набор элементов одного типа.
  • Строковый тип — массив, хранящий строку символов.
  • Структура — набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.

 

Другие типы данных

  • Указатель — хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.

 
Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данным в программе осуществляется по их именам (идентификаторам).

Идентификатор — это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a — z, A — Z, цифры 0 — 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.

Несмотря на то, что допускается имя, имеющее до 32 символов, определяющее значение имеют только первые 8 символов. Помимо имени, все данные имеют тип. Указание типа необходимо для того, чтобы было известно, сколько места в оперативной памяти будет занимать данный объект.

Компилятор языка Си придерживается строгого соответствия прописных и строчных букв в именах идентификаторов и лексем.

ВерноНеверно
int a = 2, b;
b = a+3;
Int a=2;  // правильно int
INT a=2;
int a = 2, b;
b = A + 3; // идентификатор А не объявлен
int a = 2;
b = a + 3; // идентификатор b не объявлен

Целочисленные данные

Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2n-1, где n-количество занимаемых битов.

Знаковые целые числа представляются в диапазоне -2n-1…+2n-1-1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).

Основные типы и размеры целочисленных данных:

Количество битБеззнаковый типЗнаковый тип
8unsigned char
0…255
char
-128…127
16unsigned short
0…65535
short
-32768…32767
32unsigned intint
64unsigned long intlong int

Вещественные данные

Вещественный тип предназначен для представления действительных чисел. Вещественные числа представляются в разрядной сетке машины в нормированной форме.

Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как

12345,678 = 1,2345678·104

Число 0,009876 в нормированной форме можно представить как

0,009876 = 9,876·10-3

В двоичной системе счисления значащий разряд, стоящий перед разделителем целой и дробной части, может быть равен  только 1. В случае если число нельзя представить в нормированной форме (например, число 0), значащий разряд перед разделителем целой и дробной части равен 0.

Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа.

В общем случае вещественное число в разрядной сетке вычислительной машины можно представить в виде 4 полей.

 
Различают три основных типа представления вещественных чисел в языке Си:

ТипОбозна-
чение в Си
Кол-во битБиты степениМантиссаСдвиг
простоеfloat3230…2322…0127
двойной точностиdouble6462…5251…01023
двойной расширен- ной точностиlong double8078…6462…016383

Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:

Пример: представить число -178,125 в 32-разрядной сетке (тип float).

Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:

17810 = 101100102.

0,12510 = 0,0012.

Тогда

178,12510 = 10110010,0012=1,0110010001·2111

Для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).

Для определения степени числа применяем сдвиг:

0111111+00000111 = 10000110.

Таким образом, число -178,125 представится в разрядной сетке как

 

Символьный тип

Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char.
Подробнее о кодировке символов

 

Логический тип

Логический тип применяется в логических операциях, используется при алгоритмических проверках условий и в циклах и имеет два значения:

  • истина — true
  • ложь — — false

В программе должно быть дано объявление всех используемых данных с указанием их имени и типа. Описание данных должно предшествовать их использованию в программе.

Пример объявления объектов

 
 

int n;    // Переменная n целого типа
double a; // Переменная a вещественного типа двойной точности

Назад: Язык Си

Целочисленные типы данных в C++: short, int и long | Уроки С++

  Обновл. 22 Апр 2021  | 

На этом уроке мы рассмотрим целочисленные типы данных в языке С++, их диапазоны значений, операцию деления, а также переполнение (что это такое и примеры).

Целочисленные типы данных

Целочисленный тип данных — это тип, переменные которого могут содержать только целые числа (без дробной части, например: -2, -1, 0, 1, 2). В языке C++ есть 5 основных целочисленных типов, доступных для использования:

КатегорияТипМинимальный размер
Символьный тип данныхchar1 байт
Целочисленный тип данныхshort2 байта
int2 байта (но чаще всего 4 байта)
long4 байта
long long8 байт

Примечание: Тип char — это особый случай: он является как целочисленным, так и символьным типом данных. Об этом детально мы поговорим на одном из следующих уроков.

Основным различием между целочисленными типами, перечисленными выше, является их размер, чем он больше, тем больше значений сможет хранить переменная этого типа.

Объявление целочисленных переменных

Объявление происходит следующим образом:

char c;
short int si; // допустимо
short s; // предпочтительнее
int i;
long int li; // допустимо
long l; // предпочтительнее
long long int lli; // допустимо
long long ll; // предпочтительнее

char c;

short int si; // допустимо

short s;      // предпочтительнее

int i;

long int li; // допустимо

long l;      // предпочтительнее

long long int lli; // допустимо

long long ll;      // предпочтительнее

В то время как полные названия short intlong int и long long int могут использоваться, их сокращенные версии (без int) более предпочтительны для использования. К тому же постоянное добавление int затрудняет чтение кода (легко перепутать с именем переменной).

Диапазоны значений и знак целочисленных типов данных

Как вы уже знаете из предыдущего урока, переменная с n-ным количеством бит может хранить 2возможных значений. Но что это за значения? Это значения, которые находятся в диапазоне. Диапазон — это значения от и до, которые может хранить определенный тип данных. Диапазон целочисленной переменной определяется двумя факторами: её размером (измеряется в битах) и её знаком (который может быть signed или unsigned).

Целочисленный тип signed (со знаком) означает, что переменная может содержать как положительные, так и отрицательные числа. Чтобы объявить переменную как signed, используйте ключевое слово signed:

signed char c;
signed short s;
signed int i;
signed long l;
signed long long ll;

signed char c;

signed short s;

signed int i;

signed long l;

signed long long ll;

По умолчанию, ключевое слово signed пишется перед типом данных.

1-байтовая целочисленная переменная со знаком (signed) имеет диапазон значений от -128 до 127, т.е. любое значение от -128 до 127 (включительно) может храниться в ней безопасно.

В некоторых случаях мы можем заранее знать, что отрицательные числа в программе использоваться не будут. Это очень часто встречается при использовании переменных для хранения количества или размера чего-либо (например, ваш рост или вес не может быть отрицательным).

Целочисленный тип unsigned (без знака) может содержать только положительные числа. Чтобы объявить переменную как unsigned, используйте ключевое слово unsigned:

unsigned char c;
unsigned short s;
unsigned int i;
unsigned long l;
unsigned long long ll;

unsigned char c;

unsigned short s;

unsigned int i;

unsigned long l;

unsigned long long ll;

1-байтовая целочисленная переменная без знака (unsigned) имеет диапазон значений от 0 до 255.

Обратите внимание, объявление переменной как unsigned означает, что она не сможет содержать отрицательные числа (только положительные).

Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:

Размер/ТипДиапазон значений
1 байт signedот -128 до 127
1 байт unsignedот 0 до 255
2 байта signedот -32 768 до 32 767
2 байта unsignedот 0 до 65 535
4 байта signedот -2 147 483 648 до 2 147 483 647
4 байта unsignedот 0 до 4 294 967 295
8 байтов signedот -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
8 байтов unsignedот 0 до 18 446 744 073 709 551 615

Для математиков: Переменная signed с n-ным количеством бит имеет диапазон от -(2n-1) до 2n-1-1. Переменная unsigned с n-ным количеством бит имеет диапазон от 0 до (2n)-1.

Для нематематиков: Используем таблицу 🙂

Начинающие программисты иногда путаются между signed и unsigned переменными. Но есть простой способ запомнить их различия. Чем отличается отрицательное число от положительного? Правильно! Минусом спереди. Если минуса нет, значит число — положительное. Следовательно, целочисленный тип со знаком (signed) означает, что минус может присутствовать, т.е. числа могут быть как положительными, так и отрицательными. Целочисленный тип без знака (unsigned) означает, что минус спереди отсутствует, т.е. числа могут быть только положительными.

Что используется по умолчанию: signed или unsigned?

Так что же произойдет, если мы объявим переменную без указания signed или unsigned?

КатегорияТипПо умолчанию
Символьный тип данныхcharsigned или unsigned (в большинстве случаев signed)
Целочисленный тип данныхshortsigned
intsigned
longsigned
long longsigned

Все целочисленные типы данных, кроме char, являются signed по умолчанию. Тип char может быть как signed, так и unsigned (но, обычно, signed).

В большинстве случаев ключевое слово signed не пишется (оно и так используется по умолчанию).

Программисты, как правило, избегают использования целочисленных типов unsigned, если в этом нет особой надобности, так как с переменными unsigned ошибок, по статистике, возникает больше, нежели с переменными signed.

Правило: Используйте целочисленные типы signed, вместо unsigned.

Переполнение

Вопрос: «Что произойдет, если мы попытаемся использовать значение, которое находится вне диапазона значений определенного типа данных?». Ответ: «Переполнение».

Переполнение (англ. «overflow») случается при потере бит из-за того, что переменной не было выделено достаточно памяти для их хранения.

На уроке №28 мы говорили о том, что данные хранятся в бинарном (двоичном) формате и каждый бит может иметь только 2 возможных значения (0 или 1). Вот как выглядит диапазон чисел от 0 до 15 в десятичной и двоичной системах:

Десятичная системаДвоичная система
00
11
210
311
4100
5101
6110
7111
81000
91001
101010
111011
121100
131101
141110
151111

Как вы можете видеть, чем больше число, тем больше ему требуется бит. Поскольку наши переменные имеют фиксированный размер, то на них накладываются ограничения на количество данных, которые они могут хранить.

Примеры переполнения

Рассмотрим переменную unsigned, которая состоит из 4-х бит. Любое из двоичных чисел, перечисленных в таблице выше, поместится внутри этой переменной.

«Но что произойдет, если мы попытаемся присвоить значение, которое занимает больше 4-х бит?». Правильно! Переполнение. Наша переменная будет хранить только 4 наименее значимых (те, что справа) бита, все остальные — потеряются.

Например, если мы попытаемся поместить число 21 в нашу 4-битную переменную:

Десятичная системаДвоичная система
2110101

Число 21 занимает 5 бит (10101). 4 бита справа (0101) поместятся в переменную, а крайний левый бит (1) просто потеряется. Т.е. наша переменная будет содержать 0101, что равно 101 (нуль спереди не считается), а это уже число 5, а не 21.

Примечание: О конвертации чисел из двоичной системы в десятичную и наоборот будет отдельный урок, где мы всё детально рассмотрим и обсудим.

Теперь рассмотрим пример в коде (тип short занимает 16 бит):

#include <iostream>

int main()
{
unsigned short x = 65535; // наибольшее значение, которое может хранить 16-битная unsigned переменная
std::cout << «x was: » << x << std::endl;
x = x + 1; // 65536 — это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдет переполнение, так как переменнная x не может хранить 17 бит
std::cout << «x is now: » << x << std::endl;
return 0;
}

#include <iostream>

int main()

{

    unsigned short x = 65535; // наибольшее значение, которое может хранить 16-битная unsigned переменная

    std::cout << «x was: » << x << std::endl;

    x = x + 1; // 65536 — это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдет переполнение, так как переменнная x не может хранить 17 бит

    std::cout << «x is now: » << x << std::endl;

    return 0;

}

Результат выполнения программы:

x was: 65535
x is now: 0

Что случилось? Произошло переполнение, так как мы попытались присвоить переменной x значение больше, чем она способна в себе хранить.

Для тех, кто хочет знать больше: Число 65 535 в двоичной системе счисления представлено как 1111 1111 1111 1111. 65 535 — это наибольшее число, которое может хранить 2-байтовая (16 бит) целочисленная переменная без знака, так как это число использует все 16 бит. Когда мы добавляем 1, то получаем число 65 536. Число 65 536 представлено в двоичной системе как 1 0000 0000 0000 0000, и занимает 17 бит! Следовательно, самый главный бит (которым является 1) теряется, а все 16 бит справа — остаются. Комбинация 0000 0000 0000 0000 соответствует десятичному 0, что и является нашим результатом.

Аналогичным образом, мы получим переполнение, использовав число меньше минимального из диапазона допустимых значений:

#include <iostream>

int main()
{
unsigned short x = 0; // наименьшее значение, которое 2-байтовая unsigned переменная может хранить
std::cout << «x was: » << x << std::endl;
x = x — 1; // переполнение!
std::cout << «x is now: » << x << std::endl;
return 0;
}

#include <iostream>

int main()

{

    unsigned short x = 0; // наименьшее значение, которое 2-байтовая unsigned переменная может хранить

    std::cout << «x was: » << x << std::endl;

    x = x — 1; // переполнение!

    std::cout << «x is now: » << x << std::endl;

    return 0;

}

Результат выполнения программы:

x was: 0
x is now: 65535

Переполнение приводит к потере информации, а это никогда не приветствуется. Если есть хоть малейшее подозрение или предположение, что значением переменной может быть число, которое находится вне диапазона допустимых значений используемого типа данных — используйте тип данных побольше!

Правило: Никогда не допускайте возникновения переполнения в ваших программах!

Деление целочисленных переменных

В языке C++ при делении двух целых чисел, где результатом является другое целое число, всё довольно предсказуемо:

#include <iostream>

int main()
{
std::cout << 20 / 4 << std::endl;
return 0;
}

#include <iostream>

int main()

{

    std::cout << 20 / 4 << std::endl;

    return 0;

}

Результат:

5

Но что произойдет, если в результате деления двух целых чисел мы получим дробное число? Например:

#include <iostream>

int main()
{
std::cout << 8 / 5 << std::endl;
return 0;
}

#include <iostream>

int main()

{

    std::cout << 8 / 5 << std::endl;

    return 0;

}

Результат:

1

В языке C++ при делении целых чисел результатом всегда будет другое целое число. А такие числа не могут иметь дробь (она просто отбрасывается, не округляется!).

Рассмотрим детально вышеприведенный пример: 8 / 5 = 1.6. Но как мы уже знаем, при делении целых чисел результатом является другое целое число. Таким образом, дробная часть (0.6) значения отбрасывается и остается 1.

Правило: Будьте осторожны при делении целых чисел, так как любая дробная часть всегда отбрасывается.

Оценить статью:

Загрузка…

Поделиться в социальных сетях:

C++. Урок 2. Типы переменных | Учи Урок информатики

Основано на учебнике на code-live.ru, cppstudio.com

Перед прочтением рекормедуется ознакомиться со статьей АЛГОРИТМ. Урок 3. Величины, переменные, константы.

а так же предыдущим уроком серии С++

Объявление переменных в C++

Чтобы объявить переменную используется синтаксис тип <имя>;. Вот некоторые примеры объявления переменных:


1
2
3

int num;
char character;
float num_float;

Допустимо объявление нескольких переменных одного и того же типа в одной строке, для этого каждая из них должна быть отделена запятой.

Основные типы данных в C++
  • int — целочисленный тип данных.
  • float — тип данных с плавающей запятой.
  • double — тип данных с плавающей запятой двойной точности.
  • char — символьный тип данных.
  • bool — логический тип данных.

















ТипбайтДиапазон принимаемых значений
целочисленный (логический) тип данных
bool10   /   255
целочисленный (символьный) тип данных
char10   /   255
 целочисленные типы данных
short int2-32 768    /    32 767
unsigned short int20  /  65 535
int4-2 147 483 648   /   2 147 483 647
unsigned int40     /     4 294 967 295
long int4-2 147 483 648    /    2 147 483 647
unsigned long int40     /     4 294 967 295
типы данных с плавающей точкой
float4-2 147 483 648. 0  / 2 147 483 647.0
long float8-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0
double8-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0

Пожалуйста, оцените статью

4.2 из 5. (Всего голосов:260)

Все статьи раздела

НОУ ИНТУИТ | Лекция | Основы языка Си: структура Си-программы, базовые типы и конструирование новых типов, операции и выражения

Аннотация: Лекция посвящена введению в язык Си. Объясняются общие принципы построения Си-программы: разбиение проекта на h- и c-файлы, т.е. разделение интерфейса и реализации, использование препроцессора. Приводятся базовые типы языка Си, конструкции массива и указателя, позволяющие строить новые типы, а также модификаторы типов. Рассматриваются всевозможные операции и выражения языка Си.

Основы языка Си

В настоящее время язык Си и объектно-ориентированные языки
его группы (прежде всего C++, а также Java и C#) являются основными
в практическом программировании. Достоинство языка Си — это,
прежде всего, его простота и лаконичность. Язык Си легко учится.
Главные понятия языка Си, такие, как статические и локальные
переменные, массивы, указатели, функции и т.д., максимально приближены
к архитектуре реальных компьютеров. Так, указатель — это просто адрес
памяти, массив — непрерывная область памяти, локальные переменные — это
переменные, расположенные в аппаратном стеке,
статические — в статической памяти. Программист,
пишущий на Си, всегда достаточно точно представляет себе, как
созданная им программа будет работать на любой конкретной архитектуре.
Другими словами, язык Си предоставляет программисту
полный контроль над компьютером.

Первоначально язык Си задумывался как заменитель Ассемблера
для написания операционных систем. Поскольку Си — это язык
высокого уровня, не зависящий от конкретной архитектуры, текст
операционной системы оказывался легко переносимым с одной платформы на
другую. Первой операционной системой, написанной практически целиком на
Си, была система Unix. В настоящее время почти все используемые операционные системы написаны на Си. Кроме того, средства программирования, которые операционная система
предоставляет разработчикам прикладных программ (так называемый API —
Application Program Interface), — это наборы системных функций на языке Си.

Тем не менее, область применения языка Си не ограничилась
разработкой операционных систем. Язык Си оказался очень удобен
в программах обработки текстов и изображений, в научных и инженерных расчетах.
Объектно-ориентированные языки на основе Си
отлично подходят для программирования в оконных средах.

В данном разделе будут приведены лишь основные понятия языка
Си (и частично C++). Это не заменяет чтения полного учебника по
Си или C++, например, книг [6] и [8].

Мы будем использовать компилятор C++ вместо Cи. Дело в том,
что язык Си почти целиком входит в C++, т.е. нормальная программа,
написанная на Си, является корректной C++ программой. Слово
«нормальная» означает, что она не содержит неудачных конструкций,
оставшихся от ранних версий Си и не используемых в настоящее
время. Компилятор C++ предпочтительнее, чем компилятор Си, т.к.
он имеет более строгий контроль ошибок. Кроме того, некоторые
конструкции C++, не связанные с объектно-ориентированным программированием,
очень удобны и фактически являются улучшением
языка Си. Это, прежде всего, комментарии //, возможность описывать
локальные переменные в любой точке программы, а не только в начале блока,
и также задание констант без использования оператора #define препроцесора.
Мы будем использовать эти возможности
C++, оставаясь по существу в рамках языка Си.

Структура Си-программы

intuit.ru/2010/edi»>Любая достаточно большая программа на Си (программисты используют термин проект ) состоит из файлов. Файлы транслируются Си-компилятором независимо друг от друга и затем объединяются программой-построителем задач, в результате чего создается файл с программой, готовой к выполнению. Файлы, содержащие тексты Си-программы, называются исходными.

В языке Си исходные файлы бывают двух типов:

  • заголовочные, или h-файлы;
  • файлы реализации, или Cи-файлы.

Имена заголовочных файлов имеют расширение » .h «. Имена файлов реализации имеют расширения » .c » для языка Си и » .cpp «, » .cxx » или » .cc » для языка C++.

К сожалению, в отличие от языка Си, программисты не сумели договориться о едином расширении имен для файлов, содержащих программы на C++. Мы будем использовать расширение » .h » для заголовочных файлов и расширение » .cpp » для файлов реализации.

Заголовочные файлы содержат только описания. Прежде всего, это прототипы функций. Прототип функции описывает имя функции, тип возвращаемого значения, число и типы ее аргументов. Сам текст функции в h-файле не содержится. Также в h-файлах описываются имена и типы внешних переменных, константы, новые типы, структуры и т.п. В общем, h-файлы содержат лишь интерфейсы, т.е. информацию, необходимую для использования программ, уже написанных другими программистами (или тем же программистом раньше). Заголовочные файлы лишь сообщают информацию о других программах. При трансляции заголовочных файлов, как правило, никакие объекты не создаются. Например, в заголовочном файле нельзя определить глобальную переменную. Строка описания

определяющая целочисленную переменную x, является ошибкой. Вместо этого следует использовать описание

означающее, что переменная x определена где-то в файле реализации (в каком — неизвестно). Слово extern (внешняя) лишь сообщает информацию о внешней переменной, но не определяет эту переменную.

Файлы реализации, или Cи-файлы, содержат тексты функций и определения глобальных переменных. Говоря упрощенно, Си-файлы содержат сами программы, а h-файлы — лишь информацию о программах.

Представление исходных текстов в виде заголовочных файлов и файлов реализации необходимо для создания больших проектов, имеющих модульную структуру. Заголовочные файлы служат для передачи информации между модулями. Файлы реализации — это отдельные модули, которые разрабатываются и транслируются независимо друг от друга и объединяются при создании выполняемой программы.

Файлы реализации могут подключать описания, содержащиеся в заголовочных файлах. Сами заголовочные файлы также могут использовать другие заголовочные файлы. Заголовочный файл подключается с помощью директивы препроцессора #include. Например, описания стандартных функций ввода-вывода включаются с помощью строки

(stdio — от слов standard input/output). Имя h-файла записывается в угловых скобках, если этот h-файл является частью стандартной Си-библиотеки и расположен в одном из системных каталогов. Имена h-файлов, созданных самим программистом в рамках разрабатываемого проекта и расположенных в текущем каталоге, указываются в двойных кавычках, например,

Препроцессор — это программа предварительной обработки текста
непосредственно перед трансляцией. Команды препроцессора называются директивами. Директивы препроцессора содержат символ диез # в начале
строки. Препроцессор используется в основном для подключения h-файлов.
В Си также очень часто используется директива #define для задания
символических имен констант. Так, строка

задает символическое имя PI для константы 3.14159265. После этого
имя PI можно использовать вместо числового значения. Препроцессор
находит все вхождения слова PI в текст и заменяет их на константу.
Таким образом, препроцессор осуществляет подмену одного текста другим.
Необходимость использования препроцессора всегда свидетельствует о
недостаточной выразительности языка. Так, в любом Ассемблере средства
препроцессирования используются довольно интенсивно. В Си по возможности
следует избегать чрезмерного увлечения командами препроцессора — это
затрудняет понимание текста программы и зачастую ведет к трудно
исправляемым ошибкам. В C++ можно обойтись без использования директив #define для задания констант. Например, в C++ константу PI можно задать
с помощью нормального описания

const double PI = 3.14159265;

Это является одним из аргументов в пользу применения компилятора
C++ вместо Си даже при трансляции программ, не содержащих конструкции
класса.

Преобразование типов при присваивании | Программирование на C и C++

Преобразование типов предназначено для ситуации, в которой переменные одного типа смешиваются с переменными другого типа. Когда возникает подобная ситуация в операторе присваивания, используется правило преобразования типов: значение справа (выражение) от оператора присваивания преобразуется к типу объекта, стоящего слева (целевой переменной). Это демонстрируется следующим примером:

int х;
char ch;
float f;

void func(void)
{
ch = х; /*    1    */
х = f;    /*    2    */
f = ch;  /*    3    */
f = x;    /*    4    */
}

В строке 1 левые, старшие, биты целочисленной переменной х обрубаются, оставляя в ch младшие 8 битов. Если х содержит число между 256 и 0, то ch и х будут иметь одинаковое значение Иначе значение ch будет содержать только младший набор битов переменной х. В строке 2 х получает целую часть переменной f. В строке 3 f получает 8-битное целое число, хранящееся в ch преобразованное к формату с плавающей точкой. В строке 4 f получает значение целочисленной переменной х, преобразованное к формату с плавающей точкой.

Когда происходит преобразование из целого числа к символу, из длинного целого — к целому и из целого — к короткому целому, то старшие биты будут потеряны. Когда используется 16-битное целое, это означает, что 8 бит будут потеряны при преобразовании от целого к символу и 16 бит будут потеряны при преобразовании от длинного целого к целому.

Таблица содержит все преобразования типов. Следует помнить два важных момента, которые могут повлиять на переносимость создаваемого кода:

Таблица: Обычные результаты преобразования типов
Целевой тип Исходный тип Возможные потери информации
signed char unsigned char Если значение > 127, то результат станет отрицательным числом
char short int Старшие 8 бит
char int (16 бит) Старшие 8 бит
char int (32 бита) Старшие 24 бита
short int int (16 бит) Нет
short int int (32 бита) Старшие 16 бит
int (16 бит) long int Старшие 16 бит
int (32 бита) long int Нет
float double Точность, результат округляется
double long double Точность, результат округляется

  1.  Преобразование из int в float или из float в double и тому подобное не добавляет точности. Такого рода преобразования только изменяют формат представления значения.
  2. Некоторые компиляторы С (и процессоры) всегда трактуют переменные типа char как положительные, независимо от того, какое значение было при преобразовании к целому или плавающему типам. Другие компиляторы могут трактовать переменную типа char как знаковую, где числа, большие, чем 127, трактуются как отрицательные (как делает Borland С++). В целом следует использовать переменные типа char для символов, a int, short int или signed char когда необходимо избежать проблем с переносимостью.

Для получения преобразования, не указанного в таблице, надо просто пошагово преобразовывать типы, пока не получится нужный тип. Например, для преобразования из double в int сначала следует преобразовать double в float, а затем float в int.

При использовании компьютерного языка типа Паскаль, где запрещено автоматическое преобразование типов, можно подумать, что С — слишком скользкий язык. Следует помнить, что С разрабатывался для облегчения жизни программистов, предоставляя возможность работать на нем, а не на ассемблере. С этой целью С позволяет осуществлять такие преобразования типов.

Объявление переменных в языке программирования C-51*

Описание переменных в языке программирования C имеет огромнейшее значение, так как именно оно в большинстве случаев определяет объем программы.
Обычно большой объем загрузочного модуля программы вызван неправильным объявлением переменных в исходном тексте программы. Обращение к внутренним
регистрам микроконтроллеров и внешним ресурсам разрабатываемого устройства тоже производится при помощи заранее объявленных переменных.

В языке программирования C51 любая переменная должна быть объявлена до первого использования этой переменной. Как
уже говорилось ранее, этот язык программирования предназначен для написания программ для микроконтроллеров
семейства MCS-51, поэтому в составе языка должна отображаться внутренняя структура этого семейства микроконтроллеров. Эти
особенности отражены во введении новых типов данных. В остальном язык программирования C-51 не отличается от
стандарта ANSI.

Объявление переменной в языке программирования C51 представляется в следующем виде:

   [спецификатор класса памяти]  спецификатор типа  [спецификатор типа памяти] описатель [=инициатор] [,описатель [= инициатор] ]...

Описатель — идентификатор простой переменной либо более сложная конструкция с квадратными скобками, круглыми скобками
или звездочкой (набором звездочек).

Спецификатор типа — одно или несколько ключевых слов, определяющие тип объявляемой переменной. В языке СИ имеется
стандартный набор типов данных, используя который можно сконструировать новые (уникальные) типы данных.

Инициатор — задает начальное значение или список начальных значений, которые (которое) присваивается переменной при объявлении.

Спецификатор класса памяти — определяется одним из четырех ключевых слов языка С: auto, bit, extern, register, sbit, sfr, sfr16 static auto, extern, register, static, и указывает,
каким образом будет распределяться память под объявляемую переменную, с одной стороны, а с другой, область видимости этой
переменной, т. е., из каких частей программы можно к ней обратиться.

Спецификатор типа памяти — определяется одним из шести ключевых слов языка С-51: code, data, idata, bdata, xdata, pdata и указывает,
в какой области памяти микроконтроллера будет размещена переменная.

Категории типов данных

Ключевые слова для определения основных типов данных

     Целые типы данных:     Типы данных с плавающей запятой:
       bit                            float
       sbit
       char
       int
       short
       long
       signed
       unsigned
       sfr
       sfr16

Переменная любого типа может быть объявлена как неизменяемая. Это достигается добавлением ключевого слова const к спецификатору типа. Объекты с типом const
представляют собой данные, используемые только для чтения, т.е. этой переменной не может быть присвоено новое значение. Отметим, что если после слова const
отсутствует спецификатор типа, то подразумевается спецификатор типа int. Если ключевое слово const стоит перед объявлением составных типов (массив, структура, смесь,
перечисление), то это приводит к тому, что каждый элемент также должен являться немодифицируемым, т. е. значение ему может быть присвоено только один раз.

Примеры использования ключевого слова const:

      const float A=2.128E-2;
      const B=286; //подразумевается const int B=286

Отметим, что переменные с спецификатором класса памяти размещаются во внутреннем ОЗУ. Неизменяемость контролируется только на этапе трансляции. Для размещения
переменной в ПЗУ лучше воспользоваться спецификатором типа памяти code

Целые типы данных

Для определения данных целого типа используются различные ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под
переменные (табл. 6).

Таблица 6

ТипРазмер памяти в битахРазмер памяти в байтахДиапазон значений
bit1 от 0 до 1
char81от -128 до 127
unsigned shar81oт 0 до 255
int, short162от -32768 до 32767
long324от -2 147 483 648 до 2 147 483 647
unsigned int, unsigned short162от 0 до 65535
unsigned long324от 0 до 4 294 967 295
sbit1 0 или 1
sfr81oт 0 до 255
sfr16162от 0 до 65535

Отметим, что ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое
слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова
unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует
идентификатор переменной, то она будет рассматриваться как переменная типа int. Например:

unsigned int n;  //Беззнаковое шестнадцатиразрядное число n
unsigned int b;
int c;           //подразумевается  signed   int c
unsigned d;      //подразумевается  unsigned int d
signed f;        //подразумевается  signed   int f

Отметим, что модификатор типа char используется для представления одиночного символа или для объявления строковых литералов. Значением объекта типа char
является код (размером 1 байт), соответствующий представляемому символу.

Отметим также, что восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned. Это достигается указанием суффикса u или U после константы,
константа без этого префикса считается знаковой.

Например:

0xA8C   //int  signed
01786l  //long signed
0xF7u   //int  unsigned

Числа с плавающей запятой

Для переменных, представляющих число с плавающей запятой используется модификатор
типа float. Модификатор double тоже допустим в языке программирования C51, но он не приводит к увеличению точности
результата.

Величина с модификатором типа float занимает 4 байта. Из них 1 бит отводится для знака, 8 бит для избыточной
экспоненты и 23 бита для мантиссы. Отметим, что старший бит мантиссы всегда равен 1, поэтому он не заполняется,
в связи с этим диапазон значений переменной с плавающей точкой равен от ±1.175494E-38 до ±3.402823E+38.

Пример объявления переменной с плавающей запятой:

float f, a, b;

Переменные перечислимого типа

Переменная, которая может принимать значение из некоторого списка значений, называется переменной перечислимого типа или перечислением.

Использование такого вида переменной эквивалентно применению целой знаковой переменной char или int. Это означает, что для переменной перечислимого вида
будет выделен один или два байта в зависимости от максимального значения используемых этой переменной констант. В отличие от переменных целого типа, переменные
перечислимого типа позволяют вместо безликих чисел использовать имена констант, которые более понятны и легче запоминаются человеком.

Например, вместо использования чисел 1,2,3,4,5,6,7 можно использовать названия дней недели: Poned, Vtorn, Sreda, Chetv, Pjatn, Subb, Voskr. При этом
каждой константе будет соответствовать свое конкретное число. Однако использование имен констант приведет к более понятной программе. Более того,
транслятор сам позволяет отслеживать правильность использования констант и при попытке использования константы, не входящей в объявленный заранее список,
выдает сообщение об ошибке.

Переменные enum типа могут использоваться в индексных выражениях и как операнды в арифметических операциях и в операциях отношения. Например:

if(rab_ned == SUB) dejstvie = rabota [rab_ned];

При объявлении перечисления определяется тип переменной перечисления и определяется список именованных констант, называемый списком перечисления.
Значением каждого имени этого списка является целое число. Объявление перечислимой переменной начинается с ключевого слова enum и может быть представлено
в двух форматах:

  1. enum [имя типа перечисления] {список констант} имя1 [,имя2 …];
  2. enum имя перечисления описатель [,описатель..];

В первом формате имена и значения констант задаются в списке констант. Необязательное имя типа объявляемой переменной — это идентификатор, который
представляет собой тип переменной, соответствующий списку констант. За списком констант записывается имя одной или нескольких переменных.

Список констант содержит одну или несколько конструкций вида:

идентификатор [= константное выражение]

Каждый идентификатор — это имя константы. Все идентификаторы в списке enum должны быть уникальными. В случае если константе явным
образом не задается число, то первому идентификатору присваивается значение 0, следующему идентификатору — значение 1 и т.д.

Пример объявления переменной rab_ned и типа переменных, совместимых с этой переменной, week выглядит следующим образом:

enum week {SUB = 0, /* константе SUB присвоено значение 0 */
           VOS = 0, /* константе VOS присвоено значение 0 */
           POND,    /* константе POND присвоено значение 1 */
           VTOR,    /* константе VTOR присвоено значение 2 */
           SRED,    /* константе SRED присвоено значение 3 */
           HETV,    /* константе HETV присвоено значение 4 */
           PJAT     /* константе PJAT присвоено значение 5 */
          } rab_ned;

Идентификатор, связанный с константным выражением, принимает значение, задаваемое этим константным выражением. Результат вычисления константного
выражения должен иметь тип int и может быть как положительным, так и отрицательным. Следующему идентификатору в списке, если этот идентификатор не имеет
своего константного выражения, присваивается значение, равное константному выражению предыдущего идентификатора плюс 1. Использование констант должно
подчиняться следующим правилам:

  1. Объявляемая переменная может содержать повторяющиеся значения констант.
  2. Идентификаторы в списке констант должны быть отличны от всех других идентификаторов в той же области видимости, включая имена обычных
    переменных и идентификаторы из других списков констант.
  3. Имена типов перечислений должны быть отличны от других имен типов перечислений, структур и смесей в этой же области видимости.
  4. Значение может следовать за последним элементом списка перечисления.

Во втором формате для объявления переменной перечислимого типа используется уже готовый тип переменной уже объявленный ранее. Например:

enum week rab1;

К переменной перечислимого типа можно обращаться при помощи указателей. При этом необходимо заранее определить тип переменной, на которую будет ссылаться
указатель. Это может быть сделано, как описывалось выше или при помощи оператора typedef. Например:

Typedef enum {SUB = 0, /* константе SUB присвоено значение 0 */
              VOS = 0, /* константе VOS присвоено значение 0 */
              POND,    /* константе POND присвоено значение 1 */
              VTOR,    /* константе VTOR присвоено значение 2 */
              SRED,    /* константе SRED присвоено значение 3 */
              HETV,    /* константе HETV присвоено значение 4 */
              PJAT     /* константе PJAT присвоено значение 5 */
             } week;

Этот оператор не объявляет переменную, а только определяет тип переменной, отличающийся от стандартного. В дальнейшем этот тип может быть использован для
объявления переменных и указателей на переменные.


* Для тех читателей
что вышли на эту страницу по поиску прошу
обратить внимание, что здесь
рассматривается не стандартный язык
программирования С, а язык, адаптированный к
микроконтроллерам серии MCS-51.
Имеются отличия!

[Назад] [Содержание]
[Вперёд]

Основные типы данных в языке Си (C)

Имя

Размер

Представляемые значения

Диапазон

(signed) char

1 байт

символы
целые числа

 
от –128 до 127

(signed) short int

2 байта

целые числа

от -32768 до 32767

(signed) int

зависит от реализации
(в последних компиляторах обычно 4 байта)

целые числа

 

(signed) long int

4 байта

целые числа

от -2147483648 до 2147483647

unsigned char

1 байт

символы
целые числа

 
от 0 до 255

unsigned short int

2 байта

целые числа

0 до 65535

unsigned int

зависит от реализации
(в последних компиляторах обычно 4 байта)

целые числа

 

unsigned long int

4 байта

целые числа

от 0 до 4294967295

float

4 байта

вещественные числа

от 1.175494351e–38
до 3.402823466e+38

double

8 байт

вещественные числа

от 2.2250738585072014e–308
до 1.7976931348623158e+308

long double

зависит от реализации

вещественные числа

 

В языке C также существуют перечислимый тип – enum , который является подмножеством целого типа, и пустой тип – void, который имеет специальное назначение. Он используется для объявления функций, которые не возвращают никакого значения, а также для объявления указателей на значение типа void. Такие указатели могут быть преобразованы к указателям на любой другой тип.

В языке С можно объявлять структуры и так называемые объединения.

В языке C нет специальных типов для массивов, строк (которые представляются массивом символов), и для логических значений. Логические значения представляются данными целого типа, при этом значение 0 соответствует логическому значению ложь, а все остальные целые значения соответствуют логическому значению истина. Этим свойством языка C можно пользоваться, например, следующим образом: значение некоторой переменной, равное 0, говорит об отсутствии некоторого признака у объекта, а остальные значения говорят о его наличии, и при этом несут какую-либо дополнительную информацию.

В языке С контроль типов не так силён, как в Паскале. Вы можете выполнять любые разумные присвоения между переменными разных типов. Кроме того, при выполнении большинства операций производятся преобразования по умолчанию для приведения операндов к одному и тому же типу:

  • все операнды типа float преобразуются к типу double ;
  • если один операнд имеет тип double , то второй операнд преобразуется к типу double ;
  • если один операнд имеет тип unsigned long , то второй операнд преобразуются к типу unsigned long ;
  • если один операнд имеет тип long int , то второй операнд преобразуются к типу long int ;
  • если один операнд имеет тип unsigned int , то второй операнд преобразуются к типу unsigned int ;
  • все операнды типов char и short преобразуются к типу int ;
  • все операнды типов unsigned char и unsigned short преобразуются к типу unsigned int ;
  • иначе оба операнда имеют тип int .

В языке С нет операций преобразованием между символом и кодом символа, т.к. в оперативной памяти символ и так храниться в виде его кода. Поэтому можно к переменной, хранящей символ, прибавить 1 и получить следующий символ.

Контроль типов языка С можно (но не нужно!) обойти с помощью операции приведения типа.

переменных C ++


Переменные C ++

Переменные — это контейнеры для хранения значений данных.

В C ++ существует различных типов переменных (определенных разными ключевыми словами), например:

  • int — сохраняет целые числа (целые числа) без десятичных знаков, например 123 или -123
  • double — хранит числа с плавающей запятой с десятичными знаками, например 19,99 или -19,99
  • char — хранит отдельные символы, такие как «a» или «B».Значения символов заключены в одинарные кавычки
  • строка — хранит текст, например «Hello World».
    Строковые значения заключены в двойные кавычки
  • bool — сохраняет значения с двумя состояниями:
    правда или ложь

Объявление (создание) переменных

Для создания переменной необходимо указать тип и присвоить ему значение:

Синтаксис

тип переменная = значение ;

Где тип — один из типов C ++ (например, int ), и
переменная — это имя переменной (например, x или
myName ).Знак равенства используется для присвоения значений переменной.

Чтобы создать переменную, которая должна хранить число, посмотрите на следующий пример:

Пример

Создайте переменную с именем myNum типа int и присвойте ей значение 15 :

int myNum = 15;
cout << myNum;

Попробуй сам »

Вы также можете объявить переменную без присвоения значения и присвоить значение позже:

Обратите внимание, что если вы присвоите новое значение существующей переменной, оно перезапишет предыдущее значение:

Пример

int myNum = 15; // myNum равно 15
myNum = 10; // Теперь myNum равно 10
cout << myNum; // Выводит 10

Попробуй сам »


Прочие типы

Демонстрация других типов данных:

Пример

int myNum = 5;
// Целое число (целое число без десятичных знаков)
double myFloatNum = 5.99;
// Число с плавающей запятой (с десятичными знаками)
char myLetter = ‘D’;
// Символ
string myText = «Hello»;
// Строка (текст)
bool
myBoolean = true; // логическое значение (истина или
ложь)

Вы узнаете больше об отдельных типах в главе «Типы данных».


Отображаемые переменные

Объект cout используется вместе с <<
оператор для отображения переменных.

Чтобы объединить текст и переменную, разделите их знаком << .
оператор:


Сложить переменные вместе

Чтобы добавить переменную к другой переменной, вы можете использовать +
оператор:


Переменные, константы и литералы C

Переменные

В программировании переменная - это контейнер (область хранения) для хранения данных.

Для обозначения области хранения каждой переменной должно быть присвоено уникальное имя (идентификатор).Имена переменных - это просто символическое представление области памяти. Например:

  int playerScore = 95;  

Здесь playerScore - это переменная типа int . Здесь переменной присвоено целочисленное значение 95 .

Значение переменной можно изменить, отсюда и имя переменной.

  char ch = 'а';
// какой-то код
ch = 'l';  

Правила присвоения имени переменной

  1. Имя переменной может содержать только буквы (как прописные, так и строчные), цифры и подчеркивание.
  2. Первая буква переменной должна быть буквой или знаком подчеркивания.
  3. Нет правила относительно длины имени (идентификатора) переменной. Однако в некоторых компиляторах могут возникнуть проблемы, если имя переменной длиннее 31 символа.

Примечание: Вы всегда должны пытаться давать значащие имена переменным. Например: firstName - лучшее имя переменной, чем fn .

C - язык со строгой типизацией.Это означает, что тип переменной не может быть изменен после того, как он объявлен. Например:

  int number = 5; // целочисленная переменная
число = 5,5; // ошибка
двойное число; // ошибка  

Здесь тип переменной number - int . Этой переменной нельзя присвоить значение с плавающей точкой (десятичное) 5.5 . Кроме того, вы не можете переопределить тип данных переменной на double . Кстати, чтобы хранить десятичные значения в C, вам нужно объявить его тип как double или float .

Посетите эту страницу, чтобы узнать больше о различных типах данных, которые может хранить переменная.


Литералы

Литералы - это данные, используемые для представления фиксированных значений. Их можно использовать прямо в коде. Например: 1 , 2,5 , 'c' и т. Д.

Здесь 1 , 2,5 и 'c' - литералы. Почему? Вы не можете присвоить этим условиям разные значения.


1. Целые числа

Целое число - это числовой литерал (связанный с числами) без дробной или экспоненциальной части.В программировании на C есть три типа целочисленных литералов:

  • десятичное (основание 10)
  • восьмеричный (основание 8)
  • шестнадцатеричный (основание 16)

Например:

Десятичный: 0, -9, 22 и т. Д.
Восьмеричный: 021, 077, 033 и т. Д.
Шестнадцатеричный: 0x7f, 0x2a, 0x521 и т. Д. 

В программировании на C восьмеричное начинается с 0 , а шестнадцатеричное - с 0x .


2. Литералы с плавающей запятой

Литерал с плавающей запятой - это числовой литерал, имеющий либо дробную, либо экспоненциальную форму.Например:

-2,0
0,0000234
-0,22E-5 

Примечание: E-5 = 10 -5


3. Персонажи

Символьный литерал создается заключением одного символа в одинарные кавычки. Например: 'a' , 'm' , 'F' , '2' , '}' и т. Д.


4. Последовательность побега

Иногда необходимо использовать символы, которые нельзя ввести или которые имеют особое значение в программировании на C.Например: новая строка (ввод), табуляция, вопросительный знак и т. Д.

Для использования этих символов используются escape-последовательности.

Последовательности побега
Последовательности побега Персонаж
\ b Backspace
\ f Подача формы
\ n Новая строка
\ r Возврат
\ т Горизонтальная вкладка
\ v Вертикальный язычок
\ Обратная косая черта
\ ' Одинарная кавычка
\ " Двойные кавычки
\? Вопросительный знак
\ 0 Пустой символ

Например: \ n используется для новой строки.Обратная косая черта \ вызывает переход от обычного способа обработки символов компилятором.


5. Строковые литералы

Строковый литерал - это последовательность символов, заключенная в двойные кавычки. Например:

"хорошо" // строковая константа
"" // константа пустой строки
"" // строковая константа из шести пробелов
"x" // строковая константа, состоящая из одного символа.
"Земля круглая \ n" // выводит строку с новой строкой 

Константы

Если вы хотите определить переменную, значение которой нельзя изменить, вы можете использовать ключевое слово const .Это создаст константу. Например,

  const двойной PI = 3,14;  

Обратите внимание, мы добавили ключевое слово const .

Здесь PI - символическая константа; его значение не может быть изменено.

  const двойной PI = 3,14;
PI = 2,9; // Ошибка  

Вы также можете определить константу с помощью директивы препроцессора #define . Мы узнаем об этом в руководстве по макросам C.

Переменные в C ++

Переменная - это имя, связанное со значением, которое можно изменить.Например, когда я пишу int num = 20; здесь имя переменной - num, которое связано со значением 20, int - это тип данных, который представляет, что эта переменная может содержать целочисленные значения. Мы рассмотрим типы данных в следующем уроке. В этом уроке мы обсудим переменные.

Синтаксис объявления переменной в C ++

 тип_данных имя_переменной = значение1, имя_переменной = значение2; 

Например:

 целое число1 = 20, число2 = 100; 

Мы также можем записать это так:

 int num1, num2;
число1 = 20;
число2 = 100; 

Типы переменных

Переменные можно разделить на категории в зависимости от их типа данных.Например, в приведенном выше примере мы видели переменные целого типа. Ниже приведены типы переменных, доступные в C ++.

int : Этот тип переменных содержит целочисленное значение.

char : содержит символьные значения, такие как «c», «F», «B», «p», «q» и т. Д.

bool : содержит логическое значение true или false.

double : значение с плавающей запятой двойной точности.

float : значение с плавающей запятой одинарной точности.

Типы переменных в зависимости от их области действия

Прежде чем идти дальше, давайте сначала обсудим, что такое область действия. Когда мы обсуждали программу Hello World, мы видели фигурные скобки в программе следующим образом:

 int main {

// Какой-то код

} 

Любая переменная, объявленная внутри этих фигурных скобок, имеет область действия, ограниченную этими фигурными скобками. Если вы объявите переменную в функции main () и попытаетесь использовать эту переменную вне функции main (), вы получите ошибку компиляции.

Теперь, когда мы поняли, что такое прицел. Перейдем к типам переменных в зависимости от области видимости.

1. Глобальная переменная
2. Локальная переменная

Глобальная переменная

Переменная, объявленная вне какой-либо функции (включая основную), называется глобальной переменной. Глобальные переменные имеют свою область действия по всей программе, к ним можно получить доступ в любом месте программы, в основном, в пользовательской функции, где угодно.

Давайте рассмотрим пример, чтобы понять это:

Пример глобальной переменной

Здесь у нас есть глобальная переменная myVar , объявленная вне main.Мы дважды обращались к переменной в функции main () без каких-либо проблем.

 #include 
используя пространство имен std;
// Это глобальная переменная
char myVar = 'A';
int main ()
{
   cout << "Значение myVar:" << myVar << endl;
   myVar = 'Z';
   cout << "Значение myVar:" << myVar;
   возврат 0;
} 

Выход:

 Значение myVar: A
Значение myVar: Z 

Локальная переменная

Локальные переменные объявляются в фигурных скобках любой пользовательской функции, основной функции, циклов или любых управляющих операторов (if, if-else и т. Д.), И их область действия ограничена этими фигурными скобками.

Пример локальной переменной
 #include 
используя пространство имен std;

char myFuncn () {
// Это локальная переменная
char myVar = 'A';
}
int main ()
{
   cout << "Значение myVar:" << myVar << endl;
   myVar = 'Z';
   cout << "Значение myVar:" << myVar;
   возврат 0;
} 

Вывод:
Ошибка времени компиляции, потому что мы пытаемся получить доступ к переменной myVar вне ее области.Область действия myVar ограничена телом функции myFuncn () внутри этих фигурных скобок.

Могут ли глобальная и локальная переменные иметь одинаковое имя в C ++?

Давайте посмотрим пример с одинаковыми именами глобальной и локальной переменной.

 #include 
используя пространство имен std;
// Это глобальная переменная
char myVar = 'A';
char myFuncn () {
   // Это локальная переменная
   char myVar = 'B';
   return myVar;
}
int main ()
{
   cout << "Вызов функции:" << myFuncn () << endl;
   cout << "Значение myVar:" << myVar << endl;
   myVar = 'Z';
   cout << "Вызов функции:" << myFuncn () << endl;
   cout << "Значение myVar:" << myVar << endl;
   возврат 0;
} 

Выход:

 Функциональный вызов: B
Значение myVar: A
Функциональный вызов: B
Значение myVar: Z 

Как видите, когда я изменил значение myVar в основной функции, он изменил только значение глобальной переменной myVar , потому что область действия локальной переменной myVar ограничена функцией myFuncn () .

Использование типов данных и переменных

В этом руководстве вы узнаете больше о том, как переменные и типы данных используются в Java.

Переменные

Переменные можно рассматривать как «контейнеры» для данных. Каждая переменная должна иметь уникальное имя, чтобы вы могли ссылаться на нее в программе.
Используя переменные, мы можем ссылаться на значения, которые еще не были определены. Например, мы можем ссылаться на скорость мяча в разных частях игрового кода, но вычислить скорость мяча позже на основе разных входных данных.Как назвать переменную, в основном зависит от вас, но рекомендуется использовать имена, которые отражают цель, например, mBall относится к мячу в коде игры.
Однако в Java есть несколько правил именования переменных, которые необходимо соблюдать:

  • Имя должно начинаться с буквы, знака доллара «$» или подчеркивания «_».
  • Имя не может быть «зарезервированным словом». Зарезервированные слова используются языком Java для обозначения определенных вещей.

Полное руководство по именованию переменных в Java см. В документации по переменным на веб-сайте Oracle.

Типы данных

При создании переменной нам также необходимо объявить тип данных, который она содержит. Это связано с тем, что программа будет использовать разные типы данных по-разному.
Языки программирования по-разному определяют типы данных. Например, почти во всех языках различаются «целые числа» (или целые числа, например, 12), «нецелые числа» (числа с десятичными знаками, например, 0,24) и «символы» (буквы алфавита или слова). Но в Java также есть несколько «примитивных» типов данных:

  • char - одиночный 16-битный символ Unicode, например буква, десятичный знак или знак пунктуации.
  • boolean - может иметь только два возможных значения: true (1) или false (0). Этот тип данных полезен в условных операторах, которые мы рассмотрим более подробно на неделе 3.
  • байт - имеет минимальное значение -128 и максимальное значение 127 (включительно).
  • короткий - имеет минимальное значение -32 768 и максимальное значение 32 767 (включительно).
  • int: - имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно).
  • long - имеет минимальное значение -9,223,372,036,854,775,808 и максимальное значение 9,223,372,036,854,775,807 (включительно).
  • float - число с плавающей запятой 32-битной точности
  • double - это число двойной точности с плавающей запятой.

Типы данных, которые содержат числовые значения: байт , короткий , int , длинный , float и double .Разница между ними заключается в размере и точности значения, которое они содержат.
Несколько символов или «строк» ​​(например, слова и предложения) также поддерживаются в Java за счет использования String .

Объявление переменной

Перед использованием переменной в программе на Java ее необходимо объявить. Думайте об этом как о наклейке на контейнер с описанием содержимого.

Пример 1

Если вы хотите объявить две переменные целочисленного типа с именами myInteger и MyInteger в Java, это будет записано как:

  int myInteger; 
int MyInteger;

Это объявление состоит из 3 частей: сначала объявляется тип данных int , затем имя переменной myInteger и, наконец, оператор завершается точкой с запятой ; .Синтаксис (или порядок) Java требует, чтобы мы заканчивали каждый «оператор» или блок инструкций точкой с запятой.
Имена переменных Java чувствительны к регистру, поэтому MyInteger и myInteger считаются двумя разными переменными. Чтобы избежать путаницы, лучше выбирать более четкие имена.

Пример 2

В этом случае имена переменных указывают на их использование:

  float mBallSpeedX; 
float mBallSpeedY;

mBallSpeedX удерживает скорость mBall в горизонтальном направлении (или оси X), а mBallSpeedY удерживает скорость mBall в вертикальном направлении (или оси Y).Также возможно присваивать значения переменным в том же операторе, что и объявление. Например;

  поплавок mBallX = 0; 
float mBallY = 0;

Это сообщает программе, что переменная с именем mBallX содержит данные с плавающей запятой и что ее значение равно 0 (она находится в 0 по оси X и Y).

Область применения

Переменные имеют время жизни, также называемое областью действия. Переменные, объявленные внутри методов, «живут» только внутри методов, тогда как переменные, объявленные вне методов (те, которые мы начинаем со строчной буквы m), могут быть доступны из всех методов, потому что они «живут» внутри класса TheGame.Мы рассмотрим методы (также называемые функциями) более подробно на неделе 6.


Теперь вы познакомились с переменными и типами данных и узнали, как объявлять переменную и присваивать ей значения. На следующем шаге вы можете проверить свои знания в викторине.

Что такое переменные в компьютерных программах

Переменная - это способ ссылки на область памяти в компьютерной программе. В этой области памяти хранятся значения - числа, текст или более сложные типы данных, например, платежные ведомости.

Операционные системы загружают программы в разные части памяти компьютера, поэтому невозможно точно узнать, в какой области памяти хранится конкретная переменная до запуска программы. Когда переменной присваивается символическое имя, например «employee_payroll_id», компилятор или интерпретатор может решить, где сохранить переменную в памяти.

Типы переменных

Когда вы объявляете переменную в программе, вы указываете ее тип, который может быть выбран из целочисленного, с плавающей запятой, десятичного, логического или допускающего значения NULL.Тип сообщает компилятору, как обрабатывать переменную и проверять наличие ошибок типа. Тип также определяет положение и размер памяти переменной, диапазон значений, которые она может хранить, и операции, которые могут быть применены к переменной. Вот несколько основных типов переменных:

int - Int - сокращение от «целое число». Он используется для определения числовых переменных, содержащих целые числа. В переменных типа int могут храниться только отрицательные и положительные целые числа.

null - Обнуляемое int имеет тот же диапазон значений, что и int, но может хранить null в дополнение к целым числам.

char - Тип char состоит из символов Unicode - букв, которые представляют большинство письменных языков.

bool - Bool - это фундаментальный тип переменной, который может принимать только два значения: 1 и 0, которые соответствуют истинному и ложному.

float, double и decimal - эти три типа переменных обрабатывают целые числа, числа с десятичными знаками и дроби. Разница между этими тремя заключается в диапазоне значений.Например, double в два раза больше float и вмещает больше цифр.

Объявление переменных

Прежде чем вы сможете использовать переменную, вы должны объявить ее, что означает, что вы должны присвоить ей имя и тип. После объявления переменной вы можете использовать ее для хранения данных, которые вы объявили для хранения. Если вы попытаетесь использовать переменную, которая не была объявлена, ваш код не скомпилируется. Объявление переменной в C # принимает форму:

<тип_данных> <список_переменных>;

Список переменных состоит из одного или нескольких имен идентификаторов, разделенных запятыми.Например:

int i, j, k;

char c, ch;

Инициализация переменных

Переменным присваивается значение с помощью знака равенства, за которым следует константа. Форма такая:

<тип_данных> <имя_переменной> = значение;

Вы можете присвоить значение переменной одновременно с ее объявлением или позже. Например:

интервал я = 100;

или же

короткий а;
int b;
двойной c;

/ * фактическая инициализация * /
a = 10;
b = 20;
c = a + b;

О C #

C # - это объектно-ориентированный язык, в котором не используются глобальные переменные.Хотя он может быть скомпилирован, он почти всегда используется в сочетании с .NET framework, поэтому приложения, написанные на C #, запускаются на компьютерах с установленным .NET.

Что такое переменная в компьютерном программировании?

Переменные используются для хранения информации, на которую можно ссылаться и которой можно манипулировать в компьютерной программе. Они также позволяют маркировать данные описательными именами, чтобы читатель и мы могли лучше понять наши программы.Полезно рассматривать переменные как контейнеры, содержащие информацию. Их единственная цель - маркировать и хранить данные в памяти. Затем эти данные можно использовать в вашей программе.

Присвоение имен переменным - одна из самых сложных задач в компьютерном программировании. Когда вы называете переменные, хорошо подумайте об именах. Постарайтесь сделать все возможное, чтобы имя, которое вы присваиваете переменной, было точно описательным и понятным для другого читателя. Иногда этот другой читатель - это вы, когда повторно посещаете программу, которую написали за несколько месяцев или даже лет до этого.

При присвоении переменной используется символ = . Имя переменной идет слева, а значение, которое вы хотите сохранить в переменной, идет справа.

  irb: 001> first_name = 'Джо'
=> «Джо»
  

Здесь мы присвоили значение 'Joe' , которое является строкой, переменной first_name . Теперь, если мы хотим ссылаться на эту переменную, мы можем.

  irb: 002> first_name
=> «Джо»
  

Как видите, теперь мы сохранили строку 'Joe' в памяти для использования во всей программе.

Примечание. Убедитесь, что вы не перепутали оператор присваивания ( = ) с оператором равенства ( == ). Отдельный символ = присваивает значение, в то время как символ == проверяет, равны ли две вещи.

Давай попробуем кое-что. Посмотрите на следующий сеанс irb.

  irb: 001> а = 4
=> 4
irb: 002> b = а
=> 4
irb: 003> a = 7
=> 7
  

Какое значение b на данный момент? Сделайте свое предположение, а затем введите этот сеанс в irb, чтобы узнать.

Вы заметите, что значение b остается 4, а a было переназначено на 7. Это показывает, что переменные указывают на значения в памяти и не связаны друг с другом глубоко. Если это сбивает вас с толку, не волнуйтесь, у нас есть для вас множество упражнений, которые сделают эту информацию ясной и очевидной. А если сомневаетесь, всегда пробуйте в irb.

До сих пор вы могли назначать данные переменным только из программы. Однако в реальной жизни вы захотите, чтобы другие люди могли интересно взаимодействовать с вашими программами.Для этого мы также должны разрешить пользователю хранить информацию в переменных. Затем мы можем решить, что мы хотим делать с этими данными.

Один из способов получить информацию от пользователя - вызвать метод получает . получает означает "получить строку", и это очень весело. Когда вы его используете, программа ждет, пока пользователь 1) введет информацию и 2) нажмет клавишу ввода. Давай попробуем. Введите эти примеры в irb, чтобы почувствовать их, и поиграйте с ними, если хотите.

  irb: 001> name = получает
Боб
=> «Боб \ n»
  

После кода name = получает , компьютер ждал, пока мы введем некоторую информацию. Мы набрали «Боб», а затем нажали клавишу «Ввод», и программа вернула «Боб \ n» . \ n в конце является символом «новой строки» и представляет собой клавишу ввода. Но мы не хотим, чтобы это было частью нашей строки. Мы будем использовать chomp в цепочке получает , чтобы избавиться от этого - вы можете поставить .chomp после любой строки, чтобы удалить символы возврата каретки в конце.

  irb: 001> name = gets.chomp
Боб
=> «Боб»
  

Ну вот! Это намного красивее. Теперь мы можем использовать переменную name по своему усмотрению.

  irb: 001> name = gets.chomp
Боб
=> «Боб»
irb: 002> name + 'супер здорово!'
=> «Боб супер классный!»
  

Область действия переменной определяет, где в программе переменная доступна для использования.Область действия переменной определяется местом инициализации или создания переменной. В Ruby область видимости переменной определяется блоком . Блок - это фрагмент кода, следующий за вызовом метода, обычно ограниченный фигурными скобками {} или do / end . Имейте в виду, что не все пары do / end подразумевают блок. Мы рассмотрим это более подробно в последующих курсах.

Теперь, когда у вас есть представление о том, что составляет область видимости переменной, мы хотим, чтобы вы запомнили одно правило:

Внутренняя область может обращаться к переменным, инициализированным во внешней области, но не наоборот.

Если взглянуть на код, это станет яснее. Допустим, у нас есть файл с именем scope.rb .

  # scope.rb

a = 5 # переменная инициализируется во внешней области

3 раза делать | n | # вызов метода с блоком
  a = 3 # доступен здесь, во внутренней области?
конец

ставит
  

Какое значение имеет значение a при выводе на экран? Попробуйте сами.

Значение a равно 3.Это связано с тем, что a доступны для внутренней области, созданной 3. times do ... end , что позволило коду повторно присвоить значение a . Фактически, он трижды переназначал его до 3. Давайте попробуем что-нибудь еще. Мы изменим тот же кусок кода.

  # scope.rb

а = 5

3 раза делать | n | # вызов метода с блоком
  а = 3
  b = 5 # b инициализируется во внутренней области
конец

ставит
помещает b # доступен ли b здесь, во внешней области видимости?
  

Какой результат вы получили при запуске этой программы? Вы должны были получить ошибку на мелодию:

  объем.rb: 11: in `
': неопределенная локальная переменная или метод` b' для main: Object (NameError)

Это связано с тем, что переменная b недоступна вне вызова метода с блоком, в котором она инициализируется. Когда мы вызываем , помещаем b , он недоступен во внешней области видимости.

* Примечание. Ключевым отличительным фактором для принятия решения о том, считается ли код, ограниченный {} или do / end блоком (и тем самым создавая новую область для переменных), является проверка того, соответствует ли код {} или / end следует сразу за вызовом метода.Например:

  arr = [1, 2, 3]

для я в arr do
  a = 5 # здесь инициализируется a
конец

ставит # это доступно здесь?
  

Ответ - да. Причина в том, что код для ... do / end создал новую внутреннюю область видимости , а не , поскольку для является частью языка Ruby, а не вызовом метода. Когда мы используем каждый , умножаем на и другие вызовы методов, за которыми следует {} или do / end , тогда создается новый блок.

Прежде чем мы продолжим, вы должны знать, что существует пять типов переменных. Константы, глобальные переменные, переменные класса, переменные экземпляра и локальные переменные. Хотя вам пока не стоит слишком сильно беспокоиться об этих темах, вот краткое описание каждой из них.

Константы объявляются с заглавной буквы в имени переменной в соответствии с соглашением Ruby. Они используются для хранения данных, которые никогда не нужно изменять. В то время как большинство языков программирования не позволяют изменять значение, присвоенное константе, Ruby позволяет.Однако он выдаст предупреждение, сообщающее, что для этой переменной было предыдущее определение. То, что вы можете, не означает, что вам следует изменить значение. На самом деле не стоит. Константы не могут быть объявлены в определениях методов и доступны во всех областях вашего приложения.

Пример объявления константы:

  MY_CONSTANT = 'Я доступен во всем вашем приложении.'
  

Глобальные переменные объявляются, если имя переменной начинается со знака доллара ( $ ).Эти переменные доступны во всем вашем приложении, перекрывая все границы области видимости. Рубисты, как правило, избегают глобальных переменных, поскольку при их использовании могут возникнуть неожиданные сложности.

Пример объявления глобальной переменной:

  $ var = 'Я также доступен через ваше приложение.'
  

Переменные класса объявляются, если имя переменной начинается с двух знаков @ . Эти переменные доступны как экземплярам вашего класса, так и самому классу.Когда вам нужно объявить переменную, связанную с классом, но каждому экземпляру этого класса не требуется собственное значение для этой переменной, вы используете переменную класса. Переменные класса должны быть инициализированы на уровне класса, вне каких-либо определений методов. Затем их можно изменить с помощью определений методов класса или экземпляра.

Пример объявления переменной класса:

  @@ instance = 0
  

Переменные экземпляра объявляются, если имя переменной начинается с одного знака @ .Эти переменные доступны в текущем экземпляре родительского класса. Переменные экземпляра могут пересекать некоторые границы области видимости, но не все из них. Вы узнаете больше об этом, когда перейдете к темам ООП, и не должны использовать переменные экземпляра, пока не узнаете о них больше.

Пример объявления переменной экземпляра:

  @var = 'Я доступен для текущего экземпляра этого класса.'
  

Локальные переменные - это наиболее часто встречающиеся переменные, которые подчиняются всем границам области видимости.Эти переменные объявляются, начиная с имени переменной ни с $ , ни с @ , а также без использования заглавных букв всего имени переменной.

Пример объявления локальной переменной:

  var = 'Меня нужно передать, чтобы пересечь границы.'
  

В этой главе мы говорили о том, как использовать переменные для хранения информации для последующего использования и как получить информацию от пользователя. Мы также показали, что не все переменные созданы равными и что область действия, в которой определяется переменная, изменяет ее доступность во всей программе.Теперь, когда вы знаете различные типы переменных и способы их использования, давайте применим некоторые из этих знаний на практике с помощью некоторых упражнений.

типов переменных в статистике и исследованиях

Список общих и необычных типов переменных

Посмотрите видео с кратким обзором нескольких распространенных типов переменных:

Не можете посмотреть видео? Кликните сюда.

«Переменная» в алгебре на самом деле означает только одно - неизвестное значение.Однако в статистике вы встретите десятков типов переменных. В большинстве случаев это слово по-прежнему означает, что вы имеете дело с чем-то неизвестным, но, в отличие от алгебры, это неизвестное не всегда является числом.

Некоторые типы переменных используются чаще других. Например, у вас гораздо больше шансов встретить непрерывные переменные, чем фиктивные. Следующие ниже списки отсортированы по общим типам переменных (например, независимые и зависимые) и менее распространенным типам (например, ковариантные и некомитантные).

Не знаете, что такое разные типы переменных? Попробуйте одного из полезных репетиторов Chegg (первые 30 минут бесплатно!).

Щелкните любое имя переменной, выделенное жирным шрифтом, чтобы узнать больше об этом конкретном типе.

  • Категориальная переменная : переменные, которые можно разделить на категории. Например, категория «Бренды зубных паст» может содержать переменные Colgate и Aquafresh .
  • Смешивающая переменная : дополнительные переменные, которые имеют скрытое влияние на результаты ваших экспериментов.
  • Непрерывная переменная : переменная с бесконечным числом значений, например «время» или «вес».
  • Управляющая переменная : фактор эксперимента, который должен оставаться постоянным. Например, в эксперименте, чтобы определить, заставляет ли свет расти растения быстрее, вам нужно будет контролировать качество почвы и воды.
  • Зависимая переменная : результат эксперимента. При изменении независимой переменной вы наблюдаете, что происходит с зависимой переменной.
  • Дискретная переменная : переменная, которая может принимать только определенное количество значений. Например, «количество машин на стоянке» дискретно, потому что автостоянка может вместить только определенное количество машин.
  • Независимая переменная : переменная, на которую не влияют никакие действия исследователя. Обычно наносится по оси абсцисс.
  • Скрытая переменная : «скрытая» переменная, влияющая на отношения между независимыми и зависимыми переменными.
  • Переменная измерения имеет связанный с ней номер. Это «количество» чего-то или «количество» чего-то.
  • Номинальная переменная : другое имя категориальной переменной.
  • Порядковая переменная : аналогична категориальной переменной, но с четким порядком. Например, уровень дохода низкий, средний и высокий можно считать порядковым.
  • Качественная переменная : широкая категория для любой переменной, которая не может быть подсчитана (т.е. не имеет числового значения). Номинальные и порядковые переменные подпадают под этот общий термин.
  • Количественная переменная: Широкая категория, включающая любую переменную, которая может быть подсчитана, или имеющую связанное с ней числовое значение. Примеры переменных, которые попадают в эту категорию, включают дискретные переменные и переменные отношения.
  • Случайные переменные связаны со случайными процессами и присваивают числа исходам случайных событий.
  • Ранжированная переменная - порядковая переменная; переменная, в которой каждая точка данных может быть упорядочена (1-я, 2-я, 3-я и т. д.).
  • Переменные отношения : аналогично интервальным переменным, но имеет значащий ноль.
  • Активная переменная: переменная, которой манипулирует исследователь.
  • Антецедентная переменная : переменная, предшествующая независимой переменной.
  • Переменная атрибута : другое имя категориальной переменной (в статистическом программном обеспечении) или переменной, которой не манипулируют (при разработке экспериментов).
  • Двоичная переменная : переменная, которая может принимать только два значения, обычно 0/1.Также может быть «да» / «нет», «высокий / низкий» или другая комбинация двух переменных.
  • Переменная коллайдера : переменная, представленная узлом на причинном графе, у которого есть пути, указывающие как внутрь, так и наружу.
  • Ковариатная переменная : подобно независимой переменной, она влияет на зависимую переменную, но обычно не является интересующей переменной. См. Также: Некорректная переменная .
  • Критерийная переменная : другое имя для зависимой переменной, когда переменная используется в неэкспериментальных ситуациях.
  • Дихотомическая переменная : другое имя двоичной переменной.
  • Фиктивные переменные : используется в регрессионном анализе, когда вы хотите назначить отношения несвязанным категориальным переменным. Например, если у вас есть категории «имеет собак» и «владеет автомобилем», вы можете присвоить 1 значению «имеет собак» и 0 значению «владеет автомобилем».
  • Эндогенная переменная : аналогично зависимым переменным, на них влияют другие переменные в системе.Используется почти исключительно в эконометрике.
  • Экзогенная переменная : переменные, влияющие на других участников системы.
  • Explanatory Variable : тип независимой переменной. Когда переменная независима, никакие другие переменные на нее не влияют. Когда переменная точно не является независимой, это объясняющая переменная.
  • Посторонние переменные - это любые переменные, которые вы намеренно не изучаете в своем эксперименте или тесте.
  • Группирующая переменная (также называемая переменной кодирования, групповой переменной или переменной) сортирует данные в файлах данных по категориям или группам.
  • переменных-идентификаторов: переменных, используемых для однозначной идентификации ситуаций.
  • Индикаторная переменная : другое имя фиктивной переменной.
  • Интервальная переменная : значимое измерение между двумя переменными. Также иногда используется как другое имя для непрерывной переменной.
  • Промежуточная переменная : переменная, которая используется для объяснения взаимосвязи между переменными.
  • Скрытая переменная: скрытая переменная, которую нельзя измерить или наблюдать напрямую.
  • Переменная манифеста : переменная, которую можно непосредственно наблюдать или измерять.
  • Управляемая переменная : другое имя для независимой переменной.
  • Переменная-посредник или промежуточная переменная: переменные, которые объясняют, как происходит связь между переменными.Например, он может объяснить разницу между предиктором и критерием.
  • Модерирующая переменная : изменяет силу влияния между независимыми и зависимыми переменными. Например, психотерапия может снизить уровень стресса у женщин в большей степени, чем у мужчин, поэтому секс смягчает эффект между психотерапией и уровнями стресса.
  • мешающая переменная : посторонняя переменная, которая увеличивает общую изменчивость.
  • Наблюдаемая переменная : измеряемая переменная (обычно используется в SEM).
  • Переменная результата : аналогична по значению зависимой переменной, но используется в неэкспериментальном исследовании.
  • Полихотомические переменные : переменные, которые могут иметь более двух значений.
  • Переменная-предиктор : аналогична по значению независимой переменной, но используется в регрессионных и неэкспериментальных исследованиях.
  • Отвечающая переменная : неформальный термин для зависимой переменной, обычно используемый на научных выставках.
  • Scale Variable : по сути, другое имя для переменной измерения.
  • Study Variable (Research Variable) : может означать любую переменную, используемую в исследовании, но имеет более формальное определение при использовании в клиническом исследовании.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *