Bool. Величины такого типа могут принимать только значения true и false
Скачать 26.16 Kb.
|
19. Типы данных. Концепция типов данных. Логический тип (bool). Величины такого типа могут принимать только значения true и false. Внутренне представление false – 0 (ноль). Любое другое значение интерпретируется на true. При преобразовании к целому типу имеет значение 1. В Си отсутствует логический тип данных. Вместо него используется целый тип int: 0 – это ложь; все, отличное от нуля – это истина. Чаще всего истина – это 1, например вечный цикл while выглядит так: while(1) { //тело цикла }; 20. Типы данных. Концепция типов данных. Типы с плавающей точкой. Стандарт определяет три типа данных для хранения вещественных значений: float, double, long double. Внутреннее представление состоит из двух частей: мантиссы и порядка. Пример описания в программе: float x; double y;
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 и всего выражения. Скобки необходимы для того, чтобы выражение, стоящее в них, вычислялось раньше операции приведения типа, имеющей больший приоритет, чем сложение. |