Главная страница
Навигация по странице:

  • Пример программы на С++

  • Область действия идентификатора

  • Класс памяти

  • Время жизни

  • Знак операции

  • Bool. Величины такого типа могут принимать только значения true и false


    Скачать 26.16 Kb.
    НазваниеBool. Величины такого типа могут принимать только значения true и false
    Дата20.04.2023
    Размер26.16 Kb.
    Формат файлаdocx
    Имя файла19-24.docx
    ТипДокументы
    #1077798

    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 и всего выражения. Скобки необходимы для того, чтобы выражение, стоящее в них, вычислялось раньше операции приведения типа, имеющей больший приоритет, чем сложение.


    написать администратору сайта