Файл: Bool. Величины такого типа могут принимать только значения true и false.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.01.2024
Просмотров: 14
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
19. Типы данных. Концепция типов данных. Логический тип (bool).
Величины такого типа могут принимать только значения true и false. Внутренне представление false – 0 (ноль). Любое другое значение интерпретируется на true. При преобразовании к целому типу имеет значение 1.
В Си отсутствует логический тип данных. Вместо него используется целый тип int: 0 – это ложь; все, отличное от нуля – это истина. Чаще всего истина – это 1, например вечный цикл while выглядит так:
while(1) {
//тело цикла
};
20. Типы данных. Концепция типов данных. Типы с плавающей точкой.
Стандарт определяет три типа данных для хранения вещественных значений: float, double, long double.
Внутреннее представление состоит из двух частей: мантиссы и порядка.
Пример описания в программе: float x; double y;
Тип | Диапазон значений | Размер (байт) |
bool | true и false | 1 |
signed char | -128 …127 | 1 |
unsigned char | 0 … 255 | 1 |
signed short int | -32 768 … 32 767 | 2 |
unsigned short int | 0 … 65 535 | 2 |
signed long int | -2 147 483 648 …2 147 483 647 | 4 |
unsigned long int | 0 … 4 294 967 295 | 4 |
float | 3.4е-38 … 3.4е+38 | 4 |
double | -1.7е+308 … 1.7е+308 | 8 |
long double | 3.4е-4932 … 3.4е+4932 | 10 |
21. Типы данных. Концепция типов данных. Соотношение размеров основных типов данных. Тип void.
Соотношение размеров основных типов данных
Для написания переносимых на различные платформы программ НЕЛЬЗЯ делать предположений о размере типа int. Для его получения пользуются операцией sizeof(int), результат которой типа байт.
Например, для ОС MS-DOS sizeof(int) вернет 2 байта, для Windows 9X – 4 байта.
В стандарте ANSI диапазоны значений основный типов не задаются, определяется только соотношение между размерами:
sizeof(float)<= sizeof(double)<=sizeof(long double)
sizeof(char)<= sizeof(short)<=sizeof(int)<=sizeof(long)
Максимальные и минимальные допустимые значения для целых типов зависят от реализации и приведены в заголовочном файле
Тип void
Множество значений этого типа пусто.
Тип используется:
- для определения функций, которые не возвращают значений;
- как базовый тип указателей;
- в операции преобразования типов.
Подробнее эту тему рассмотрим дальше. Или нет.
22. Структура программы. Пример. Переменная.
Программа на языке С++ состоит из функций, описаний и директив препроцессора. Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции.
Простейшее определение функции имеет формат:
<Тип> <имя> ([<параметры>]) {
<тело функции>
}
Тип – тип возвращаемого значения;
имя – название функции;
параметры – аргументы функции;
тело – операторы функции.
- Если функция ничего не возвращает, то тип void;
- тело функции является блоком и заключается в {};
- функции не могут быть вложенными;
- каждый оператор должен заканчиваться ; (кроме составного
оператора).
Структура программы:
<директивы процессора>
<описания>
int f1();
int f2();
int main(){
<операторы main>
}
int f1(){
<операторы функции f1>
}
int f2(){
<операторы функции f2>
}
Программа может состоять из нескольких модулей (исходных файлов).
Пример программы на С:
#include
int main(){
printf("\nhello world\n");
return 0;
// код никогда не будет выполнен
}
Директива препроцессора #include
Пример программы на С++:
#include
using namespace std;
int main() {
cout<
return 0;
}
Переменная.
Переменная — это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменять. Перед использованием любая переменная должна быть описана.
Пример:
int а; float х;
Общий вид оператора описания переменных:
[класс памяти] [const] тип имя [инициализатор];
Необязательный класс памяти может принимать одно из значений:
auto, extern, static и register.
Модификатор const показывает, что значение переменной
изменять нельзя. Такую переменную называют именованной
константой, или просто константой.
const int N=10, M=30;
При описании можно присвоить переменной начальное значение, это называется инициализацией. Инициализатор можно записывать в двух формах − со знаком равенства (C) или в круглых скобках (C++):
int x=10, y(10);
В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми.
Примеры:
short int а = 1; // целая переменная а
const char С = 'С' ; // символьная константа С
char s, sf = 'f' ; // инициализация относится только к sf
char t(54); float с=0.22, x(3), sum;
Если тип инициализирующего значения не совпадает с типом переменной, выполняются преобразования типа по определенным правилам. Описание переменной, кроме типа и класса памяти, явно или по умолчанию задает ее область действия. Класс памяти и область действия зависят не только от собственно описания, но и от места его размещения в тексте программы.
Область действия идентификатора — это часть программы, в которой его можно использовать для доступа к связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной.
Если переменная определена внутри блока она называется локальной, область ее действия − от точки описания до конца блока, включая все вложенные блоки.
Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.
23. Выражения. Классы памяти.
В любой программе требуется производить вычисления. Для вычисления значений используются выражения.
Выражения состоят из:
- операндов,
- знаков операций;
- скобок.
Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной. Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор ; (он используется, когда по синтаксису оператор требуется, а по смыслу − нет).
Примеры:
i++; // выполняется операция инкремента
а *= b + с; // выполняется умножение с присваиванием
fun(i, к); // выполняется вызов функции
Класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной). Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления.
Время жизни может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока).
Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти.
Чаще всего область видимости совпадает с областью действия. Исключением является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости ::
auto − автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни − с момента описания до конца блока. Для глобальных переменных этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.
extern − означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту).
static − статическая переменная. Время жизни − постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны.
register − аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto.
Описание переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе переменной и классе памяти, а определение содержит, кроме этого, указание компилятору выделить память в соответствии с типом переменной. Большинство объявлений являются одновременно и определениями.
Пример:
int а; //1 глобальная переменная а
int main(){
int b; // 2 локальная переменная b
extern int х; // 3 переменная x определена в другом месте
static int с; // 4 локальная статическая переменная с
а = 1; // 5 присваивание глобальной переменной
int а; // 6 локальная переменная а
а = 2; // 7 присваивание локальной переменной
::а = 3; // 8 присваивание глобальной переменной (C++)
}
В этом примере глобальная переменная а определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости − вся программа, кроме строк 6-8, так как в первой из них определяется локальная переменная с тем же именем, область действия которой начинается с точки ее описания и заканчивается при выходе из блока. Переменные b и с − локальные, область их видимости − блок, но время жизни различно: память под b выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная с располагается в сегменте данных и существует все время, пока работает программа.
24. Операторы. Операции инкремента и декремента. Операция sizeof.
Знак операции – это один или более символов, определяющих действие над операндами.
Внутри знака операции пробелы не допускаются.
Делятся:
- унарные; //i++;
- бинарные; // i+j;
- тернарную. // (a>b)?a:b;
Один и тот же знак может интерпретироваться по-разному в зависимости от контекста.
x=-y; // унарный минус
x-=y; // бинарный минус -> x=x-y;
x-=-y; //?
Все знаки, за исключением [], () и ?: представляют собой отдельные лексемы.
Операции увеличения и уменьшения на 1 (++ и --). Эти операции, имеют две формы записи – префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется.
++nl увеличить до использования;
nl++ увеличить после использования;
--nl уменьшить до использования;
nl-- уменьшить после использования.
Инкрементные и декрементные операторы можно применять только к переменным. (i+j)++ /*неверно*/
Если требуется только увеличить или уменьшить значение переменной, то безразлично какой оператор использовать, как например:
if (c == '\n') nl++;
Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:
sizeof выражение
sizeof ( тип )
Пример:
#include
using namespace std;
int main() {
float x = 1;
cout<<"sizeof(float):"<
cout<<"\nsizeof(x):"<
cout<<"\nsizeof (x + 1.0) :"<
return 0;
}
Последний результат связан с тем, что вещественные константы по умолчанию имеют тип doublе, к которому, как к более длинному, приводится тип переменной x и всего выражения. Скобки необходимы для того, чтобы выражение, стоящее в них, вычислялось раньше операции приведения типа, имеющей больший приоритет, чем сложение.