Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Лекция 4. 4.4. Переменные и выражения





4.4. Переменные и выражения

 

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

Рассмотрим составные части выражений и правила их вычисления.

 

4.4.1. Переменные

 

Переменная –это именованная область памяти, предназначенная для хранения данных оп­ределенного типа. У переменной постоянное имя, а значение может меняться. Перед использованием любая переменная должна быть описана, например:

int a; float х; // Переменные: a – целого типа, x - вещественного

Общий вид оператора описания переменных таков:

[класс памяти] [const] тип имя [инициализатор];

Модификатор const сообщает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто констан­той.

При описании переменной можно сразу указать ее начальное значение, это действие называ­ется инициализацией. Инициализатор записывается в одной из двух форм – со знаком равенства или в круглых скобках. Константаобязана инициализироваться при объявлении. В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми. Примеры:

short int a = 1; // целая переменная а

const char C = ‘С’; // символьная константа С

char s, sf = ‘f’; // инициализация относится только к sf

char t (54);

float c = 0.22, x(3), sum;

Описание переменной за­дает также ее область действия. Область действия идентификатора –это часть программы, в которой его мож­но использовать для доступа к связанной с ним памяти. В зависимости от области действия переменная может быть локальной или глобальной. Если переменная определена внутри блока (он ограничен фигур­ными скобками), она называется локальной, область ее действия – от точки описа­ния до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.

Класс памяти определяет время жизни и область видимости программного объек­та (в частности, переменной). Если класс памяти не указан, он определяется компилятором из контекста объявления. Время жизни может быть постоянным (в течение всего выполнения программы) и вре­менным (в течение выполнения блока).

Для задания класса памятииспользуются следующие спецификаторы.

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

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

· staticстатическая переменная. Время ее жизни – постоянное. Глобальные статические переменные видны только в том модуле, в котором они описаны.

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

Если при описании значение переменных не задано, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализи­руются.

Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами). Пример:

int a; // Глобальная переменная а

int main ()

{

int b; // Локальная переменная b

extern int x; // Переменная х определена в другом месте

static int с: // Локальная статическая переменная с

а = 1; x = 2; // Присваивания глобальным переменным

…………….

return 0;

}

int x = 4; //Определение и инициализация х

Описание константы или переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе и классе памяти, а определение кроме тогодает указание компилятору выделить память в соответствии с типом. В C++ многие объявления являются од­новременно определениями. В приведенном примере только описание переменной x в функции main является объявлением, но не определением. Переменная может быть объявлена многократно, но определена только в одном месте программы.

 

4.4.2. Операции

 

В соответствии с количеством операндов операции делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда). Рассмотрим их основные группы.

Операции увеличения и уменьшения на 1 (++, --). Эти операции, называемые также инкрементом и декрементом, имеют две формы записи – префиксную (записывается перед операндом), и постфиксную (после операнда). В префиксной форме сначала изменяется операнд, а затем его значение становится результи­рующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется.

#include <stdio.h>

int main()

{

int x = 3, у = 3;

рrintf (“Значение префиксного выражения: %d\n”, ++х);

printf (“Значение постфиксного выражения: %d\n”, у++);

printf (“Значение х после приращения: %d\n”, х);

рrintf (“Значение у после приращения: %d\n”, у);

return 0;

}

Результат работы программы:

Значение префиксного выражения: 4

Значение постфиксного выражения: 3

Значение х после приращения: 4

Значение у после приращения: 4

Операндом инкремента в общем случае должно быть так называемое L-значение(L-value ). В C++ так называется любое выражение, адресующее некоторый уча­сток памяти, в который можно занести значение (произошло от Left – левая часть опера­ции присваивания). Переменная является част­ным случаем L-значения.

В примере использован вызов функции, который в C++ считается операцией.

Операция определения размера sizeof предназначена для вычисления длины объекта или типа в байтах, и имеет две формы: sizeof выражение; sizeof (выражение).Пример:

#include <iostream.h>

int main()

{

float x = 1;

cout << “sizeof (float): “ << sizeof (float);

cout << “\nsizeof x: “ << sizeof x:

cout << “\nsizeof (x + 1.0): “ << sizeof (x + 1.0);

return 0;

}

Результат работы программы:

sizeof (float): 4

sizeof x: 4

sizeof (x + 1.0): 8

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

Операции отрицания (–,!, ~). Арифметическое отрицание (унарный минус –) меняет знак целого или вещественного операнда на противоположный. Логическое отрицание (!) дает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю. Операнд может быть булевского, целого или вещественного типа, а может также быть указателем. Поразрядное отри­цание (~) (называемое еще побитовым) инвертирует каждый разряд в двоичном представлении операнда.

Сложение (+), вычитание (-), умножение (*) – обычные арифметические операции.

Деление (/)и остаток от деления (%). Операция деления применима к операндам арифметического типа. Если оба операнда целочисленные, результат операции приводится к целому числу (дробная часть отбрасывается). Операция остаток от деления применяется только к целочисленным операндам. Знак результата зависит от реализации.

#include <stdio.h>

int main ()

{

int x = 11, у = 4;

float z = 4;

printf (“Результаты деления: %d %f\n”, x/y, x/z);

printf (“Остаток: %d\n”, x%y);

return 0;

}

Результат работы программы:

Результаты деления: 2 2.750000

Остаток: 3

Операции сдвига (<< и >>) применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда соответственно влево или вправо на количе­ство разрядов, заданное вторым операндом. При сдвиге влево освободившиеся разряды обнуляются. При сдвиге вправоосвободившиеся биты заполняются знаковым разря­дом.

Операции отношения (<, <=, >, >=, ==,!=) сравнивают первый операнд со вто­рым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false. Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения.

Имеется существенная разница между операцией проверки на равенство (==) и операцией присваивания (=), результатом которой является значение, присвоенное левому операнду.

Поразрядные операции (&, |, ^) применяются к целочисленным операн­дам и работают с их двоичными представлениями. При поразрядной конъюнкции, или поразрядном И (&) каждый бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1. При поразрядной дизъюнкции, или поразрядном ИЛИ (|) бит результата равен 1, если соответствующий бит хотя бы одного из опе­рандов равен 1. При поразрядном исключающем ИЛИ (^) бит результата равен 1 только тогда, когда соответствующие биты операндов различны.

#include <iostream.h>

int main ()

{

cout << “\n 6 & 5 = “ << (6 & 5);

cout << “\n 6 | 5 = “ << (6 | 5);

cout << “\n 6 ^ 5 = “ << (6 ^ 5);

return 0;

}

Результат работы программы:

6 & 5 = 4

6 | 5 = 7

6 ^ 5 = 3

Логические операции (&& и ||). Операнды логических операций И (&&) и ИЛИ (||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Любой операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю – как true).

Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева напра­во. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

Операции присваивания (=, +=, -=, *=, /= и т. д.). Любая операция присваивания может использоваться в программе как самостоятельный оператор.

Формат операции простого присваивания (=): операнд_1 = операнд_2. Первый операнд должен быть L-значением, второй – выражением. Сначала вы­числяется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную левой частью. Предыдущее содержимое этой области памяти теряется.

#include <iostream.h>

int main ()

{

int a = 3, b = 5, с = 7;

a = b; b = а; с = с + 1;

cout << “a = “ << a;

cout << “\t b = “ << b;

cout << “\t с = “ << с;

return 0;

}

Результат работы программы:

a = 5 b = 5 c = 8

Сложная операция присваивания имеет видоперанд_1 Op= операнд_2, где Op – некоторая бинарная операция. Сначала вычисляется операнд_2, затем к операндам применяется Op, после чего результат записывается по адресу, определяемому левой частью. Напри­мер, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение а += b по результату эквивалентно а = а + b.

Результатом операции присваивания является значение, записанное в ее левую часть.

Условная операция (?:)тернарная, то есть имеет три операнда. Ее формат:

операнд_1? операнд_2: операнд_3

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

#include <stdio h>

int main ()

{

int a = 11, b = 4, max;

max = (b > a)? b: a;

printf (“Наибольшее число %d”, max);

return 0;

}

Результат работы программы:

Наибольшее число 11

Другие операции C++ будут рассмотрены позднее.

 

Date: 2015-11-13; view: 361; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.012 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию