Явные преобразования при приведении типов




Унарные знаки операции

· & – операция получения адреса; //int a=9; &a® адрес FF0B:001A

·! – логическое отрицание, применяется к скалярным операндам, результат 1 (истина), если значение операнда 0 (ложь), результат 0 (ложь), если значение операнда не нуль (истина).

Например: !0®1,!(4>5)® 1,!(0<8)® 0,!5 ® 0;

· ++ (––) – инкремент (декремент) увеличение (уменьшение) операнда на единицу. Операнд – переменная.

Например: k1=7; k2=10; ++k1; k2--; получим k1=8 k2=9.

Имеются префиксная операция – увеличение (уменьшение) операнда до его использования, т.е. сначала к переменной прибавляется 1, а потом присваивается новое значение:

а=5; с=++а; получим а=а+1=6 с=а=6.

постпрефиксная – увеличение (уменьшение) операнда после его использования, т.е. сначала присваивается старое значение, а потом к переменной прибавляется 1:

b=5; d=b++; получим d=b=5 b=b+1=6.

· sizeof(…) – операция вычисления размера (в байтах) типа, который имеет операнд, разрешается два формата: sizeof(унарное выражение) и sizeof(тип).

Например: long x; sizeof(x) ® 4; sizeof(double) ® 8.

Бинарные знаки операции

· + – * – сложение, вычитание, умножение операндов;

Например: a+b a-5 a*d;

· / – деление операндов, причем при целочисленных значениях операндов результат будет целочисленным (дробная часть отбрасывается), а при хотя бы одном вещественном операнде – результат вещественный;

Например: 23/5®4, 23/5.0®4.6, 1/10®0, 1.0/10®0.1;

· % – получение остатка от деления только целочисленных операндов (в ВС++ результат будет отрицательным только при отрицательном делимом). Например: 57%2®1 49%10®9 23%5®3 -23%5®-3.

· операции отношения (сравнения): < – меньше, > – больше, <= – меньше или равно, >= – больше или равно, == – тождественно равно ,!= – не равно. Операнды – данные арифметического типа, результат целочисленный, 0 (ложь) или 1 (истина). Причем две последние операции имеют самый низкий приоритет.

Например: a>b x!=y d<=20 w==50

3>5==0>1®1 (3>5®0, 0>1®0, 0==0®1);

но (3>5==0)>1®0 (3>5®0, 0==0®1, 1>1®0);

· && || – логическая конъюнкция (И), логическая дизъюнкция (ИЛИ) арифметических операндов или отношений, результат 0 (ложь) или 1 (истина).

Например: а=2 a>-5&&a<10 ® 1 a<-5||a>10 ® 0

или а=20 a>-5&&a<10 ® 0 a<-5||a>10 ® 1

· операции присваивания – в качестве левого операнда может использоваться только леводопустимый операнд (переменная):

= – присвоить левому операнду значение выражения из правой части; a=5; b=3+a; a=b*5;

+= –= *= /= %= – присвоить левому операнду сумму, разность, произведение, частное или остаток от деления значений обоих операндов.

Например: a+=5®a=a+5, a–=b®a=a–b, a*=b®a=a*b,

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

Например: f=(d=7, d*2), получим, f=14.

Условная операция

В условной операции имеютсятри операнда и два символа:

Выражение_1? выражение_2: выражение_3;

Сначала вычисляется выражение_1, если оно истинно (не равно 0), то вычисляется выражение_2 и оно становится результатом, иначе вычисляется выражение_3, которое и будет результатом.

Например: f=-4; (f>5)?(f=5):(f=8); // f=8

A=20; С=(A>5)?10:2; // С=10

Ранг и ассоциативность операций

В языке С++ операции распределены по 16 категориям приоритетов. Категории приоритетов операций называют рангами. Операции первого ранга имеют наивысший приоритет и выполняются в первую очередь и т.д. Унарные операции имеют более высокий приоритет, чем бинарные. Операции одного ранга имеют одинаковый приоритет.

Ассоциативность – порядок выполнения операции. В основном все операции выполняются слева направо, но некоторые операции справа налево – (унарные, присваивания, условная).

Комментарии

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

Если комментарий занимает одну строку, то ставится двойная наклонная вправо черта (двойной слэш). Например:

Int My_value; // это переменная.

Если комментарий занимает более одной строки, то он вставляется в последовательность символов /*……*/. Например:

/*Моя первая программа на языке

Программирования С++*/.

Основные типы данных

Данные – это носители информации, которые обрабатываются компьютером. Данные можно условно разделить на переменные и константы.

2.1 Переменные и константы целого типа

Тип Размер Диапазон Спецификаторы
char 1 байт (8 бит) -128 ÷ 127 (–27 ÷ 27–1) %с %d %o %x
unsigned char 1 байт (8 бит) 0 ÷ +255 (0 ÷ 28–1) %с %d %o %x %u
short 2 байт (16 бит) -32768÷32767 (–215 ÷ 215–1) %d %o %x
unsigned short 2 байт (16 бит) 0 ÷ +65535 0 ÷ 216–1 %d %o %x %u
int 4 байт (32 бит) -2147483648 ÷ 2147483647 (–231 ÷ 231–1) %d %o %x
unsigned int 4 байт (32 бит) 0÷4294967295 (0 ÷ 232–1) %ld %lo %lx %lu
long 4 байт (32 бит) -2147483648 ÷ 2147483647 (–231 ÷ 231–1) %ld %lo %lx
unsigned long 4 байт (32 бит) 0÷4294967295 (0 ÷ 232–1) %ld %lo %lx %lu

Константы целого типа по умолчанию имеют тип int. Для задания типа long дописывается символ L | l, для задания типа unsigned – символ U | u (234L, 456u, 23456Lu), для задания в 8 -й СС вначале приписывается 0, в 16 -й СС – 0х (020, 0х4а).

2.2 Переменные и константы вещественного типа

Тип Размер Диапазон Спецификаторы
float 4 байт (32 бит) ±3.4∙10–38 ÷±3.4∙10+38 %f %e
double 8 байт (64 бит) ±1.7∙10–308 ÷±1.7∙10+308 %lf %le

Константы вещественного типа по умолчанию имеют тип double. Для задания типа float дописывается символ F | f.

2.3 Именованные константы

Именованные константы можно задавать таким образом:

1) с помощью слова const, например:

const int с=100;

const double R=2.718281828;

2) с помощью директивы препроцессора #define, например:

#define R 5634

#define PI 3.1415

2.4 Классы памяти и инициализация переменных

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

Переменные, определенные вне главной функции, имеют класс памяти extern (внешний). Они являются глобальными, будут доступны во всех функциях, время их существования статическое (до конца выполнения программы).

Переменные с модификатором static имеют класс памяти static (статический). Они будут доступны только в функции, где они определены, но время их существования статическое (до конца выполнения программы).

Переменные, определенные внутри главной (или другой) функции, будут иметь автоматический класс памяти. Они будут доступны только в функции, блоке, где они определены, время их существования автоматическое (до конца выполнения цикла, блока, функции).

Инициализация – это присвоение численного значения при определении переменной.Инициализация бывает неявная (по умолчанию), и явная.

Внешние и статические переменные неявно (по умолчанию) инициализируются нулями, а автоматическиепроизвольными значениями.

Явная инициализация – это присвоение конкретного численного значения при определении переменной. Например:

int a=5; float f=45.6E-5;

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

Преобразования типов при вычислении выражений

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

double sd; float ft=2.0f; char c1=40; int k=2L;

sd=ft+(c1+6)/k;

В выражении (c1+6) операнд c1 преобразуется к типу int. Затем выраже­ние (c1+6)/k преобразуется к типу int, а все выражение преобразуется к типу float. Результат всего выражения будет иметь тип double.

Преобразование типов при выполнении операций присваивания

В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение, даже если такое преобразование ведет к потере информации.

Пример: int x; char c; c=x+1;

Если х=40 (0x00000028), то с=41(0x29),

но если х=300 (0x0000012C), то с=45(0x2D), а не с=301 (0x0000012D), т.к. старшие биты не помещаются в тип char.

Следующие преобразования типов гарантируют сохранение точности:

сhar ® short® int ® long;

unsigned сhar ® unsigned short ® unsigned int ® unsigned long;

float ® double.

Явные преобразования при приведении типов

Каноническая форма преобразования:

(имя_типа)операнд;

В приведенной записи операнд – это переменная, или константа, или любое выражение, заключенное в скобки, имя_типа задает тип, к которому должен быть преобразован операнд.

Функциональная форма преобразования:

имя_типа(операнд);

В этой записи имя_типа должно иметь простое (несоставное) наименование.

Пример:

int i=2; float f=5.6; double d1,d2;

d1=(double)i*(double)f; // Правильно!

d2=double(i)*double(f); // Правильно!

unsigned long g=2,k1,k2;

k1=(unsigned long)f+g; // Правильно! преобразовывается f

k2=unsigned long(f)+g; // Ошибка! имя_типа составное

k3=(unsigned long)f+g; // Правильно! преобразовывается f




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-04-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: