Переменные и типы в C++

C++C++Beginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL cpp(("C++")) -.-> cpp/BasicsGroup(["Basics"]) cpp(("C++")) -.-> cpp/IOandFileHandlingGroup(["I/O and File Handling"]) cpp(("C++")) -.-> cpp/SyntaxandStyleGroup(["Syntax and Style"]) cpp/BasicsGroup -.-> cpp/variables("Variables") cpp/BasicsGroup -.-> cpp/data_types("Data Types") cpp/BasicsGroup -.-> cpp/operators("Operators") cpp/BasicsGroup -.-> cpp/booleans("Booleans") cpp/BasicsGroup -.-> cpp/strings("Strings") cpp/IOandFileHandlingGroup -.-> cpp/output("Output") cpp/SyntaxandStyleGroup -.-> cpp/code_formatting("Code Formatting") subgraph Lab Skills cpp/variables -.-> lab-178540{{"Переменные и типы в C++"}} cpp/data_types -.-> lab-178540{{"Переменные и типы в C++"}} cpp/operators -.-> lab-178540{{"Переменные и типы в C++"}} cpp/booleans -.-> lab-178540{{"Переменные и типы в C++"}} cpp/strings -.-> lab-178540{{"Переменные и типы в C++"}} cpp/output -.-> lab-178540{{"Переменные и типы в C++"}} cpp/code_formatting -.-> lab-178540{{"Переменные и типы в C++"}} end

Предварительный просмотр содержания

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

  • Переменные
  • Идентификаторы
  • Объявление переменной
  • Константы
  • Выражения
  • Присваивание
  • Основные типы
  • Литералы для основных типов и строки

Переменные

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

  • Переменная имеет имя (или идентификатор), например, radius, area, age, height. Имя необходимо для уникального идентификации каждой переменной, чтобы присвоить ей значение и получить хранимое значение.
  • Переменная имеет тип, такой как int, double.
  • Переменная может хранить значение этого конкретного типа. Переменная связана с типом и может хранить только значение конкретного типа.
  • Тип определяет размер и макет данных, диапазон их значений и набор операций, которые можно применить.

Следующая диаграмма иллюстрирует два типа переменных: int и double. Переменная int хранит целое число (целое число). Переменная double хранит вещественное число.

image desc

Идентификаторы

Для именования переменной (или любого другого объекта, такого как функция или класс) требуется идентификатор. C++ налагает следующие правила на идентификаторы:

  • Идентификатор - это последовательность символов, состоящая из прописных и строчных букв (a-z, A-Z), цифр (0-9) и знака подчеркивания "_".
  • Пробелы (пробел, табуляция, новая строка) и другие специальные символы (например, +, -, *, /, '@' и т.д.) не допускаются.
  • Идентификатор должен начинаться с буквы или знака подчеркивания. Он не может начинаться с цифры. Идентификаторы, начинающиеся с подчеркивания, обычно зарезервированы для системного использования.
  • Идентификатор не может быть зарезервированным ключевым словом или зарезервированным литералом (например, int, double, if, else, for).
  • Идентификаторы чувствительны к регистру. rose не является Rose и не является ROSE.

Конвенция именования переменных

Имя переменной - это существительное или фраза, состоящая из нескольких слов. Первое слово пишется строчными буквами, а остальные слова с заглавной буквы, без пробелов между словами. Например, thefontSize, roomNumber, xMax и thisIsAVeryLongVariableName, что известно как camel-case.

Рекомендации

  1. Важно выбрать имя, которое самоописательно и тесно отражает смысл переменной, например, numberOfStudents или numStudents.
  2. Не используйте бессмысленные имена, такие как a, b, c, d, i, j, k, i1, j99. Избегайте имен, состоящие из одной буквы, за исключением общих имен, таких как x, y, z для координат, i для индекса.
  3. Использовать длинные имена длиной в 30 символов совершенно нормально, чтобы убедиться, что имя точно отражает его смысл.
  4. Разумно использовать единственное и множественное число существительных для различения между переменными в единственном и множественном числе. Например, используйте переменную row для обозначения номера одной строки, а rows - для обозначения нескольких строк.

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

Прежде чем использовать переменную, ее имя и тип необходимо объявить с использованием одного из следующих синтаксисов:

Синтаксис Пример
Объявить переменную заданного типа int option;
Объявить несколько переменных одного типа, разделенных запятыми double sum, difference, product, quotient;
Объявить переменную и присвоить ей начальное значение этого типа int magicNumber = 88;
Объявить несколько переменных с начальными значениями этого типа double sum = 0.0, product = 1.0;

Например

int mark1;           // Объявить целочисленную переменную под названием mark1
mark1 = 76;          // Использовать mark1
int mark2;           // Объявить целочисленную переменную mark2
mark2 = mark1 + 10;  // Использовать mark2 и mark1
double average;      // Объявить вещественную переменную average
average = (mark1 + mark2) / 2.0;   // Использовать average, mark1 и mark2
int mark1;           // Ошибка: объявление дважды
mark2 = "Hello";     // Ошибка: присвоение значения другого типа
int number;             // Объявлена, но не инициализирована
cout << number << endl; // Использована до инициализации, без предупреждения/ошибки, но с непредвиденным результатом.

Обратите внимание, что:

  • В C++ необходимо объявить имя переменной, прежде чем ее можно использовать.
  • C++ - это "строго типизированный" язык. Переменная имеет определенный тип. Как только тип переменной объявлен, она может хранить только значение, принадлежащее данному конкретному типу.
  • Каждая переменная может быть объявлена только один раз.
  • В C++ переменную можно объявить в любом месте программы, при условии, что она объявлена перед использованием.
  • Тип переменной не может быть изменен внутри программы.
  • Переменная, только что объявленная, но не инициализированная, содержит мусор. C/C++ не выдаёт никаких предупреждений/ошибок, если вы используете переменную до ее инициализации - что может привести к непредвиденным результатам.

Константы (const)

Константы - это неизменяемые переменные, объявляемые с использованием ключевого слова const. Их значения не могут быть изменены во время выполнения программы. Также const должен быть инициализирован при объявлении. Например:

const double PI = 3.1415926;  // Необходимо инициализировать

Конвенция именования констант: Используйте прописные слова, соединенные знаком подчеркивания. Например, MIN_VALUE.

Выражения

Выражение - это комбинация операторов (например, '+', '-', '*', '/') и операндов (переменных или литеральных значений), которое можно вычислить, чтобы получить одно значение определенного типа. Например,

1 + 2 * 3           // дает int 7

int sum, number;
sum + number        // вычисляется до целочисленного значения

double principal, interestRate;
principal * (1 + interestRate)  // вычисляется до вещественного значения

Присваивание (=)

Присваивающая инструкция:

  1. присваивает литеральное значение (из правой части) переменной (из левой части); или
  2. вычисляет выражение (из правой части) и присваивает полученное значение переменной (из левой части).

Правая часть должна быть значением; а левая часть должна быть переменной (или адресом в памяти).

Синтаксис присваивающей инструкции:

Синтаксис Пример
Присвоить литеральное значение (из правой части) переменной (из левой части) number = 88;
Вычислить выражение (из правой части) и присвоить результат переменной (из левой части) sum = sum + number;

Присваивающая инструкция должна интерпретироваться следующим образом: Выражение справа (правой частью) сначала вычисляется, чтобы получить результирующее значение (называемое rvalue или правым значением). Затем rvalue присваивается переменной слева (левой части) (или lvalue, которое представляет собой место, в котором можно хранить rvalue).

Основные типы

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

Категория Тип Описание Байты(Типичные) Минимум(Типичный) Максимум(Типичный)
Целые числа int(или signed int) Знаковое целое число (не менее 16 бит) 4 (2) -2147483648 2147483647
Целые числа unsigned int Беззнаковое целое число (не менее 16 бит) 4 (2) 0 4294967295
Целые числа char Символ (может быть знаковым или беззнаковым, в зависимости от реализации) 1
Целые числа signed char Символ или знаковое маленькое целое число (гарантируется, что является знаковым) 1 -128 127
Целые числа unsigned char Символ или беззнаковое маленькое целое число (гарантируется, что является беззнаковым) 1 0 255
Целые числа signed short Короткое знаковое целое число (не менее 16 бит) 2 -32768 32767
Целые числа unsigned short Короткое беззнаковое целое число (не менее 16 бит) 2 0 65535
Целые числа long Длинное знаковое целое число (не менее 32 бит) 4 (8) -2147483648 2147483647
Целые числа unsigned long Длинное беззнаковое целое число (не менее 32 бит) 4 (8) 0 то же, что и выше
Целые числа long long Очень длинное знаковое целое число (не менее 64 бит) 8 -2e^63 2e^63-1
Целые числа unsigned long long Очень длинное беззнаковое целое число (не менее 64 бит) 8 0 2e^64-1
Действительные числа float Число с плавающей точкой, ≈7 цифр 4 3.4e^38 3.4e^(-38)
Действительные числа double Число с плавающей точкой с двойной точностью, ≈15 цифр 8 1.7e^308 1.7e^(-308)
Действительные числа long double Число с плавающей точкой с длинной двойной точностью, ≈19 цифр 12 (8)
Булевы числа bool Булево значение true или false 1 false (0) true (1 или не ноль)
Широкие символы wchar_tchar16_t,char32_t Широкий (двубайтовый) символ 2 (4)

Оператор sizeof

C/C++ предоставляет унарный оператор sizeof, чтобы получить размер операнда (в байтах). Следующая программа использует оператор sizeof, чтобы вывести размер фундаментальных типов (сохраните следующий код в test.cpp в /home/labex/Code).

/*
 * Print Size of Fundamental Types.
 */
#include <iostream>
using namespace std;

int main() {
   cout << "sizeof(char) is " << sizeof(char) << " bytes " << endl;
   cout << "sizeof(short) is " << sizeof(short) << " bytes " << endl;
   cout << "sizeof(int) is " << sizeof(int) << " bytes " << endl;
   cout << "sizeof(long) is " << sizeof(long) << " bytes " << endl;
   cout << "sizeof(long long) is " << sizeof(long long) << " bytes " << endl;
   cout << "sizeof(float) is " << sizeof(float) << " bytes " << endl;
   cout << "sizeof(double) is " << sizeof(double) << " bytes " << endl;
   cout << "sizeof(long double) is " << sizeof(long double) << " bytes " << endl;
   cout << "sizeof(bool) is " << sizeof(bool) << " bytes " << endl;
   return 0;
}

Вывод:

sizeof(char) is 1 bytes
sizeof(short) is 2 bytes
sizeof(int) is 4 bytes
sizeof(long) is 4 bytes
sizeof(long long) is 8 bytes
sizeof(float) is 4 bytes
sizeof(double) is 8 bytes
sizeof(long double) is 12 bytes
sizeof(bool) is 1 bytes
image desc

Инструкция typedef

Писать unsigned int много раз может быть раздражающим. Инструкция typedef может быть использована для создания нового имени для существующего типа. Например, вы можете создать новый тип, называемый "uint", для "unsigned int" следующим образом. Вы должны поместить typedef сразу после #include. Используйте typedef с осторожностью, потому что это делает программу трудно читаемой и понятной.

typedef unsigned int uint;

Многие компиляторы C/C++ определяют тип, называемый size_t, который является typedefом для unsigned int.

typedef unsigned int size_t;

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

Целочисленные литералы

Целое число, такое как 123 и -456, по умолчанию воспринимается как int. Например,

int number = -123;
int sum = 4567;

Кроме целых чисел в десятичной системе по умолчанию, вы можете использовать префикс '0x' для значения в шестнадцатеричной системе, и префикс '0b' для двоичного значения (в некоторых компиляторах), например,

int number1 = 1234;       // Десятичное
int number2 = 01234;      // Восьмеричное 1234, Десятичное 2322
int number3 = 0x1abc;     // Шестнадцатеричное 1ABC, Десятичное 15274
int number4 = 0b10001001; // Двоичное (возможно, не работает в некоторых компиляторах)

long литерал идентифицируется суффиксом 'L' или 'l' (избегайте строчной буквы, которая может быть ошибочно прочитана как цифра один). long long int идентифицируется суффиксом 'LL'. Также вы можете использовать суффикс 'U' для unsigned int, 'UL' для unsigned long и 'ULL' для unsigned long long int. Например,

long number = 12345678L;     // Суффикс 'L' для long
long sum = 123;              // int 123 автоматически преобразуется в long 123L
long long bigNumber = 987654321LL;  // Необходим суффикс 'LL' для long long int

Для short литералов суффикс не требуется. Но вы можете использовать только целочисленные значения в допустимом диапазоне. Например,

short midSizeNumber = -12345;

Литералы с плавающей точкой

Число с десятичной точкой, такое как 55.66 и -33.44, по умолчанию воспринимается как double. Также вы можете выражать их в научной записи, например, 1.2e3, -5.5E-6, где e или E обозначает показатель степени 10. Вы можете предшествовать дробной части или показателю степени знаком плюс (+) или минус (-). Показатель степени должен быть целым числом.

Для float литералов вы должны использовать суффикс 'f' или 'F', например, -1.2345F. Например,

float average = 55.66;      // Ошибка! Правая часть - это double. Необходим суффикс 'f' для float.
float average = 55.66f;

Для long double используйте суффикс 'L' (или 'l').

Литералы bool

Есть только два bool литерала, то есть true и false. Например,

bool done = true;
bool gameOver = false;
int i;
if (i == 9) {   // Возвращает либо true, либо false
   ......
}

Литералы символов

Печатаемый char литерал записывается в одинарных кавычках, например, 'z', '$' и '9'. В C++ символы представляются с использованием 8-битного ASCII-кода и могут быть обработаны как 8-битные знаковые целые числа в арифметических операциях. Другими словами, char и 8-битный знаковый целый тип взаимозаменяемы. Также вы можете присвоить целое число в диапазоне [-128, 127] переменной char; и [0, 255] для unsigned char. Например,

char letter = 'a';             // То же, что и 97
char anotherLetter = 98;       // То же, что и буква 'b'
cout << letter << endl;        // Выводится 'a'
cout << anotherLetter << endl; // Выводится 'b', а не число
anotherLetter += 2;            // 100 или 'd'
cout << anotherLetter << endl; // Выводится 'd'
cout << (int)anotherLetter << endl;  // Выводится 100

Литералы строк

String литерал состоит из нуля или более символов, окруженных двойными кавычками, например, "Hello, world!", "The sum is ", "". Например,

String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = "";             // Пустая строка

Пример (Литералы)

/* Testing Primitive Types */
#include <iostream>
using namespace std;

int main() {
   char gender ='m';             // char заключается в одинарные кавычки
   bool isMarried = true;         // true(не ноль) или false(0)
   unsigned short numChildren = 8; // [0, 255]
   short yearOfBirth = 1945;      // [-32767, 32768]
   unsigned int salary = 88000;   // [0, 4294967295]
   double weight = 88.88;       // С дробной частью
   float gpa = 3.88f;           // Необходим суффикс 'f' для float

   // "cout <<" можно использовать для вывода значения любого типа
   cout << "Gender is " << gender << endl;
   cout << "Is married is " << isMarried << endl;
   cout << "Number of children is " << numChildren << endl;
   cout << "Year of birth is " << yearOfBirth << endl;
   cout << "Salary is " << salary << endl;
   cout << "Weight is " << weight << endl;
   cout << "GPA is " << gpa << endl;
   return 0;
}

Вывод:

Gender is m
Is married is 1    // true
Number of children is 8
Year of birth is 1945
Salary is 88000
Weight is 88.88
GPA is 3.88
image desc

Резюме

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