Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

1.4.2 Приоритет операций

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

  • постфиксные ++ и --, вызов функции, обращение к элементу массива

  • унарные + и -, префиксные ++ и --, !, sizeof, * и & (разыменование и адрес)

  • *, /, %

  • +, - бинарные

  • <<, >>

  • <, >, <=, >=

  • =, !=

  • &

  • ^

  • |

  • &&

  • ||

  • =,+=, -= и другие составные операции

  • Операция "," - у неё самый низкий приоритет

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

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

1.4.3 Преобразование типов

При присваивании и арифметических операциях C++ выполняет все осмысленные преобразования между основными типами, чтобы их можно было сочетать без ограничений в выражениях. При автоматическом преобразовании типов операндов в выражении компилятор исходит из простого правила – преобразование выполняется к типу с более широким диапазоном. Например, при вычислении выражения 1/5.0 единица в числителе будет преобразована к вещественному типу и операция деления будет выполнена над двумя операндами с плавающей точкой – т.е. будет получен результат вещественного типа (без отсечения дробной части). Если нужно точнее указать тип знаменателя – можно написать 1/5.0F или 1/5.0L.

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

int x=1, y=5;

double z = x / y;

Несмотря на то, что переменная z имеет вещественный тип, она всё же будет инициализирована нулём, поскольку операция деления будет выполнена по правилам целочисленной арифметики с отсечением дробной части, а лишь после этого полученный нуль будет преобразован в вещественный тип.

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

1). Преобразование в стиле С – c-style cast. Синтаксис:

(тип) выражение или тип(выражение)

Например, для нашего случая:

int x=1, y=5; double z=(double)x/y;

В таком варианте переменная z получит корректное значение 0.2.

Этот способ может быть использован для преобразования любого типа в любой другой тип, при этом не проверяется корректность и безопасность преобразования – вся ответственность целиком ложится на программиста. Мы не рекомендуем использовать этот небезопасный способ. К тому же, такую конструкцию сложно искать в коде программы.

2). static_cast.

Для нашего примера:

int x=1, y=5; double z=static_cast<double>(x)/y;

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

3). const_cast − преобразование константной переменной в неконстантную (применяется только для типов - указателей и ссылок).

const int x = 1;

int *p = &x; // ошибка компиляции

int *p = const_cast<int*>(&x); // компилируется

В хорошо организованном коде необходимость такого преобразования, как правило, не возникает.

4). dynamic_cast – используется в объектно-ориентированном программировании для безопасного преобразования типов по иерархии наследования. Этот вариант будет рассмотрен в главе, посвящённой ООП.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]