Присваивание леводопустимые и праводопустимые выражения приведение типов при выполнении присваивания
Обновлено: 22.12.2024
Понятие выражения. Операция присваивания = . Преобразование и приведение типов. Инициализация. Унифицированная инициализация
Содержание
Поиск на других ресурсах:
1. Что называется выражением в языках программирования?
Выражение – это объединение операторов, литералов и переменных. Выражения используются для проведения вычислений, некоторых действий и т.д. В выражениях могут использоваться имена функций.
Примеры выражений.
⇑
2. Какой общий вид операции присваивания? Примеры
Операция присваивания используется для задания некоторого значения переменной. Значение, которое присваивается может быть результатом некоторого выражения.
В языке C/C++ операция присваивания обозначается символом = (равно).
Общий вид операции присваивания:
- переменная – имя переменной, которой присваивается значение выражения;
- выражение – некоторое выражение, которое может быть использовано согласно синтаксису языка C/C++.
Примеры операции присваивания.
⇑
3. Как используется операция присваивания при инициализации переменных? Примеры
Общий вид операции присваивания при инициализации переменных:
- тип – тип переменной, которая инициализируется;
- выражение_или_значение – значение выражения или константная величина. Если используется значение выражения, то переменные, входящие в это выражение должны быть уже объявлены на данный момент (см. пример).
Примеры инициализации переменных.
⇑
4. Понятие преобразования типа. Классификации преобразований типов
Часто в выражениях фигурируют переменные различных типов. В таких случаях компилятор выполняет так называемое приведение или преобразование одного типа в другой. В C ++ существуют следующие классификации преобразований типов:
- классификация по диапазону значений;
- классификация по способу преобразования.
⇑
5. Классификация по диапазону значений при преобразованиии типов
При классификации по диапазону значений различают:
- сужающее преобразование типов. В этом случае больший тип данных сужается к меньшему (сужается диапазон значений). Здесь может возникнуть потеря данных;
- расширяющее преобразования типов. При таком преобразовании меньший тип данных расширяется до большего типа данных (расширяется диапазон значений).
Следующие примеры демонстрируют эти два вида преобразований.
Пример 1. Демонстрируется сужающее преобразование типов.
Как видно из примера, при сужающем преобразовании типов возможна потеря данных.
Пример 2. Демонстрируется расширяющее преобразование типов.
то значение t буде равно -294967296. Это значит, что число 4000000000 не поместится в тип int .
⇑
6. Классификация по способу преобразования. Неявное и явное преобразование типов
В зависимости от направления преобразования, это преобразование может быть реализовано одним из двух способов:
- неявное преобразование. Это преобразование называют автоматическим. Неявное преобразование компилятор выполняет самостоятельно без вмешательства программиста;
- явное преобразование или приведение типов. В данном случае в скобках вписывается тип преобразования.
Пример.
⇑
7. Правила преобразования типов в выражениях
Если в выражении встречаются два операнда разных типов, то действуют следующие правила:
- все операнды преобразуются к типу самого наибольшего операнда. Процесс такого преобразования называется расширением типа (integral promotion);
- все типы char и short int преобразуются к типу int . Процесс такого преобразования называется целочисленным расширением (integer promotion);
- если один из операндов имеет тип double , тогда любой другой операнд приводится к типу double . Даже, в случае с типом char , происходит приведение к типу double ;
- после преобразования оба операнда имеют одинаковый тип, который есть типом результата операции.
Ниже приведены примеры автоматического преобразования типов.
Преобразование между типами char и int :
Преобразование между типами int и float :
Преобразование между типами float и double
⇑
8. Как осуществляются преобразования, которые связаны с типом bool ?
Если выражение содержит целочисленный тип, то значения типа bool автоматически превращаются в целые числа 0 и 1. Значению 0 соответствует значение false . Значению 1 или ненулевому значению соответствует значение true .
Пример. Фрагмент кода, который демонстрирует преобразование для типа bool
⇑
9. Какой общий вид операции явного приведения типа ( type )?
Общий вид операции приведения типа:
где тип – тип, к которому нужно привести результат вычисления выражения.
Примеры использования операции явного приведения типов.
Рекомендация. С целью получения необходимой точности при вычислении выражений, содержащих целочисленные и вещественные значения, желательно всегда делать операцию приведения типа к типу переменной, которой присваивается значение.
⇑
10. Что такое унифицированная (списковая) инициализация? Пример
Унифицированная инициализация еще называется списковой инициализацией. Этот вид инициализации переменной был добавлен начиная с версии C++ 11. С помощью унифицированной инициализации можно задать значения переменным, массивам, объектам единообразным способом.
Синтаксически унифицированная инициализация может быть реализована одним из двух способов:
1. С использованием оператора присваивания ( = ). В этом случае инициализация имеет вид:
2. Без использования оператора присваивания. Общий вид такой инициализации следующий:
В вышеприведенных формах:
Пример унифицированной инициализации переменных разних видов.
⇑
11. Как работает унифицированная (списковая) инициализация в случае преобразования более широкого типа к менее широкому? Для чего нужна унифицированная инициализация?
Унифицированная инициализация полезна, когда нужно реализовать проверку корректного приведения типов при инициализации. Унифицированная инициализация обнаруживает ошибки на этапе компиляции в случае, если происходит потеря данных. Потеря данных может возникнуть в случае неявного сужающего преобразования типов.
При унифицированной инициализации компилятор генерирует ошибку:
- когда происходит урезание значения, присваиваемого инициализированной переменной;
- когда присваиваемое значение выходит за пределы допустимых значений типа инициализируемой переменной. Эта ситуация характерна для целочисленных и символьных переменных.
При обычной инициализации (не унифицированной) компилятор допускает потерю данных и не генерирует ошибку.
Следующие примеры демонстрируют назначение унифицированной инициализации.
Пример 1. Пусть задана переменная типа int , которая должна быть инициализирована обычным способом инициализации
В этом случае произойдет неявное сужающее преобразование, поскольку переменной типа int присваивается значение типа double . В результате, значение переменной d будет равно 7.
Если инициализировать переменную d унифицированным способом инициализации
Пример 2. В этом примере показано, что унифицированная инициализация позволяет выявлять ошибки потери данных для совместимых типов. Пусть дана переменная типа short , которая инициализируется значением типа int , выходящим за допустимый диапазон типа short
Здесь компилятор ошибки не генерирует, происходит обычное переполнение и значение 200000000 урезается к типу short .
Если инициализировать переменную t унифицированным способом
Читайте также: