Студопедия

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

Разделы сайта

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






Переменные, имеющие областью видимости блок, называются локальными переменными.






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

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

В C++ это переменная, единая для всех объектов данного класса. (статическая)

Если переменная объявлена как static, то компилятор выделяет ей как и глобальной переменной постоянное место в памяти.Значение этой переменной сохраняется между вызовами блоков программы, в которых она объявлена(нестатические локальные переменные между вызовами ф-ций уничтожаются).
Отличие от глобальной в том, что она доступна только в своём блоке кода(ф-ции или файле).
Прменяется, например, при вызовах COLLBACK ф-ций, которые вызываются при поступлении в приложение сообщений.При этом значения переменных объявленных static, сохраняются.Все другие переменные необходимо заново инициализировать.

Мы объявили статическую переменную j. Если убрать слово static, то j бы заного инициализировалась при каждой новой итерации (кстати, попробуй это сделать - увидишь что получится:)).. А статическая переменная инициализируется всего лишь единожды (в определенном участке памяти).
В классах - это что-то типа глобальной переменной. Она (переменная) принадлежит всему классу, а не отдельным его объектам.
например

class someclass
{
private:
int a; // это закрытая переменная. К ней имеет доступ только методы класса
//...
public:
int b; // это открытая переменная... её могут использовать как класс, так и сторонние классы, а также сам пользователь, который создает у себя объект класса (лучше не объявлять таким образом)
static int c; // а это статическая переменная. Она принадлежит классу целиком, однако " из вне" эту переменную нельзя изменить
//...
};

Ключевое слово static можно использовать для объявления переменных, функций, данных-членов класса и функций класса.

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

Ключевое слово static можно использовать в следующих случаях.

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

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

· При объявлении данных-члена в объявлении класса ключевое слово static указывает, что всеми экземплярами этого класса совместно используется одна копия этого члена. Статические данные-член должны быть определены в области видимости файла. Целочисленные данные-член, объявляемые как conststatic, могут иметь инициализатор.

· При объявлении функции-члена в объявлении класса ключевое слово static указывает, что эта функция совместно используется всеми экземплярами данного класса. Статическая функция-член не может получать доступ к члену экземпляра, поскольку она не имеет неявного указателя this. Для доступа к члену экземпляра следует объявить функцию с параметром, являющимся указателем или ссылкой на экземпляр.

· Объявление членов объединения как статических невозможно. Однако, объединение глобально объявленное анонимным, должно быть явно объявлено как static.

Дополнительные сведения см. в разделах auto, extern и register.

Пример

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

// static1.cpp// compile with: /EHsc#include < iostream> using namespace std; void showstat(int curr) { static int nStatic; // Value of nStatic is retained // between each function call nStatic += curr; cout < < " nStatic is " < < nStatic < < endl; } int main() { for (int i = 0; i < 5; i++) showstat(i); }nStatic — 0nStatic — 1nStatic — 3nStatic — 6nStatic — 10

В следующем примере показано использование ключевого слова static в классе.

// static2.cpp// compile with: /EHsc#include < iostream> using namespace std; class CMyClass {public: static int m_i; }; int CMyClass:: m_i = 0; CMyClass myObject1; CMyClass myObject2; int main() { cout < < myObject1.m_i < < endl; cout < < myObject2.m_i < < endl; myObject1.m_i = 1; cout < < myObject1.m_i < < endl; cout < < myObject2.m_i < < endl; myObject2.m_i = 2; cout < < myObject1.m_i < < endl; cout < < myObject2.m_i < < endl; CMyClass:: m_i = 3; cout < < myObject1.m_i < < endl; cout < < myObject2.m_i < < endl; }00112233

 

Использование static внутри функции является самым простым. Это просто означает, что после того, как переменная была инициализирована, она остается в памяти до конца программы. Вы можете думать об этом, как о переменной, которая хранит свое значение до полного завершения программы. Например, вы можете использовать статическую переменную для записи количества раз, когда функция была вызвана, просто добавив строки static int count = 0; и count++; в функцию. Так как count является статической переменной, строка static int count = 0; будет выполняться только один раз. Всякий раз, когда функция вызывается, count будет иметь последнее значение, данное ему.

Вы также можете использовать static таким образом, чтобы предотвратить переинициализацию переменной внутри цикла. Например, в следующем коде переменная number_of_times будет равна 100, несмотря на то что строкаstatic int number_of_times = 0; находится внутри цикла, где она, по-видимому, должна исполнятся каждый раз, когда программа доходит до цикла. Хитрость заключается в том, что ключевое слово static препятствует повторной инициализации переменной. Одной из особенностей использования ключевого слова static является то, что оно автоматически устанавливает переменную в ноль для вас — но не полагайтесь на это (это делает ваши намерения неясными).

  for(int ix=0; ix < 10; ix++) { for(int iy = 0; iy < 10; iy++) { static int number_of_times = 0; number_of_times++; } }

 

ОПРЕДЕЛЕНИЯ И ОПИСАНИЯ С++

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

ВЫРАЖЕНИЯ И ПРЕОБРАЗОВАНИЕ ТИПОВ

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

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

Примеры выражений:

(а + 0.12)/6
х & & у ||! z
(t * sin(x)-1.05e4)/((2 * к + 2) * (2 * к + 3))

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

 

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

Преобразования бывают двух типов:

  • изменяющие внутреннее представление величин (с потерей точности или без потери точности);
  • изменяющие только интерпретацию внутреннего представления.

К первому типу относится, например, преобразование целого числа в вещественное (без потери точности) и наоборот (возможно, с потерей точности), ко второму — преобразование знакового целого в беззнаковое.

В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении».

В С++ также предусмотрена унарная операция приведения типа:

  static_cast< /*тип данных*/> (/*переменная или число*/)

пример: static_cast< float> (15)/2 результат равен 7.5
Пример с переменной:

  int ret=15; static_cast< float> (ret)/2 //результат равен 7.5

В случае с переменной надо понимать, что в строке 2 переменная ret не преобразуется в тип данных float, а всего лишь на всего создается временная копия переменной ret с типом данных float.

Функция Значение функции
IntToStr(k) Строка, являющаяся изображением целого k
FloatToStr (n) Строка, являющаяся изображением вещественного n
FloatToStrF(n, f, k, m) Строка, являющаяся изображением вещественного n. При вызове функции указывают: f – формат; k – точность; f – количество цифр после десятичной точки. Формат определяет способ изображения числа: ffGeneral – универсальный; ffExponent – научный; ffFixed – с фиксированной точкой; ffNumber – с разделителями групп разрядов; ffCurrency – финансовый. Точность – нужное общее количество цифр: 7 или меньше для значения типа Single, 15 или меньше для значения типа Double и 18 или меньше для значения типа Extended
StrToInt(s) Целое число, изображением которого является строка s
StrToFloat(s) Дробное число, изображением которого является строка S

 

ОПЕРАТОРЫ И ПОСЛЕДОВАТЕЛЬНО ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ

Язык C++ включает все операторы C и еще несколько новых операторов. Операторы определяют запускаемое вычисление на одном или нескольких операндах.

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

Приоритет и ассоциативность операторов C++

Описание оператора operator
Group 1 precedence, no associativity  
Оператор области видимости ::
Group 2 precedence, left to right associativity  
Выделение или указатель члена (объект) . or –>
Операция взятия индекса [ ]
Вызов функции ()
Постфиксный инкремент ++
Постфиксный декремент ––
Имя типа typeid()
Константы преобразования типов const_cast
Динамическое преобразование типов dynamic_cast
Reinterpreted преобразование типов reinterpret_cast
Статическое преобразование типов static_cast
Group 3 precedence, right to left associativity  
Размер объекта или типа sizeof
Префиксный инкремент ++
Префиксный декремент ––
Дополнение до единицы ~
Логическое НЕ !
Унарное отрицание -
Унарный плюс +
Взятие адреса &
Косвенное обращение *
Создание объекта new
Удаление объекта delete
Cast Cast: ()
Group 4 precedence, left to right associativity  
Указатель (объекты или указатели) .* or –> *
Group 5 precedence, left to right associativity  
Умножение *
Деление /
Остаток деления по модулю %
Group 6 precedence, left to right associativity  
Сложение +
Вычитание
Group 7 precedence, left to right associativity  
Сдвиг влево < <
Сдвиг вправо > >
Group 8 precedence, left to right associativity  
Меньше <
Больше >
Меньше или равно < =
Больше или равно > =
Group 9 precedence, left to right associativity  
Равенство ==
Неравенство ! =
Group 10 precedence left to right associativity  
Побитовое И &
Group 11 precedence, left to right associativity  
Побитовое исключающее ИЛИ ^
Group 12 precedence, left to right associativity  
Побитовое включающее ИЛИ |
Group 13 precedence, left to right associativity  
Логическое И & &
Group 14 precedence, left to right associativity  
Логическое ИЛИ ||
Group 15 precedence, right to left associativity  
Условие ?:
Group 16 precedence, right to left associativity  
Присваивание =
Присваивание умножения *=
Присваивание деления /=
Назначение модуля %=
Присваивание сложения +=
Присваивание вычитания –=
Присвоение с левым сдвигом < < =
Присвоение с правым сдвигом > > =
Назначение побитового И & =
Назначение побитового включающего ИЛИ |=
Назначение побитового исключающего ИЛИ ^=
Group 17 precedence, right to left associativity  
Выражение Throw throw
Group 18 precedence, left to right associativity  
запятая (разделитель элементов)  

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

Оператор – это языковая конструкция, представляющая шаг из последовательности действий или описаний (оператор задает законченное описание некоторого действия), оператор всегда завершается «;», за исключение составного оператора или блока. (Элементы заголовка цикла for, после которых ставится «;» оператором считать не будем).

Операторы разделим на два основных класса:

– последовательно выполняемые операторы;

– управляющие конструкции (операторы).

В данной лекции остановимся на последовательно исполняемых операторах.

 

Последовательно выполняемые операторы при выполнении тела функции выполняются последовательно друг за другом. Можно привести следующую классификацию последовательно выполняемых операторов:

операторы – объявления, например, объявления переменных, рассмотренные в лекции 2:

int i, j, k=10; double x, y;

операторы – выражения, строятся из операндов и знаков операций, выражение задает правило вычисления некоторого значения, проведем следующую классификацию выражений:

• на базе операции присваивания «=»: x=y+10;

• на базе операций инкремент, декремент (++ --): i++; --j;

• вызов функции: f1();

• комбинированные выражения: x=i++ + f();

составной оператор – это последовательность операторов, заключенных в фигурные скобки { }, синтаксически составной оператор воспринимается как отдельный оператор;

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

Перед любым оператором может ставиться метка. Метка это идентификатор, после которого ставится символ «:»

Met1: x=x+y;

Область действия метки – тело функции, имя метки должно быть уникальным внутри тела функции.

ОПЕРАТОРЫ ВЫБОРА

Синтаксис условного оператора с единственным выбором [if () {}]:

Запись для одного оператора при выполнении условия Запись для нескольких операторов при выполнении условия
if (условие)оператор_1; if (условие){оператор_1; оператор_2; …оператор_n; };

Синтаксис условного оператора с двойным выбором [if () {} else {}]:

Запись для одного оператора при выполнении условия Запись для нескольких операторов при выполнении условия
if (условие)оператор_1; elseоператор_2; if (условие){оператор_1; оператор_2; …оператор_n; }else{ оператор_n+1; оператор_n+2; … оператор_m; };

Оператором может быть любая команда или арифметическое выражение. Что касается условия, то оно должно быть логическим. Условие даёт ответ либо ложь, либо истину. Для написания условия необходимо знать, какие допустимы операции для использования, которые представлены в таблице 4.1.

Операция Название
< меньше
> больше
< = меньше или равно
> = больше или равно
= = равно
! = не равно

Таблица 4.1: Операции, используемые в задании условия

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

Условный оператор с двойным выбором if()else можно записать в следующем виде: ()? (): (). В таблице 4.2 приведены аналогичные действия, но различными способами записи.

if()else ()? (): ()
int x = 0, y = 0; cin> > x> > y;
if(x> y){cout< < ”x больше y n”; }else{cout< < ”y больше или равно x n”; } (x> y)? (cout< < ”x больше y n”;): (cout< < ”y больше или равно x n”;)

Таблица 4.2: Пример использования if()else и ()? (): ()

Иногда необходимо написать сложное логическое условие, для этого используются следующие логические операции:

|| логическое ИЛИ
& & логическое И

Например, необходимо выяснить, попадает ли введенное с клавиатуры число в диапазон [-89, 78]?

int x=0;

cin> > x;

if((x> =-89)& & (x< =78))

cout< < ”Число попадает в указанный диапазон n”;

else

cout< < ” Число не попадает в указанный диапазон n”;

Кроме условных операторов единственного и двойного выборов существует оператор switch, который предназначен для множественного выбора.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.