Главная | Форум | Статьи | Фaйлы| Картинки WoW | Профиль | Регистрация | Вход

[ Новые сообщения · Правила форума · Поиск · RSS ]

WoW-Info — информационный World of Warcraft портал

Инструкции - Форум

  • Сторінка 1 з 1
  • 1
Инструкции
МинусочегДата: Четвер, 13.01.2011, 08:41 | Сообщение # 1



Минусочег
©~Бессмертный~©
Сержант
Группа: V.I.P
Сообщений: 121

Замечания:

Оффлайн
Мельчайшей независимой частью С++ программы является инструкция. Она соответствует предложению естественного языка, но завершается точкой с запятой (;), а не точкой. Выражение С++ (например, ival + 5) становится простой инструкцией, если после него поставить точку с запятой. Составная инструкция – это последовательность простых, заключенная в фигурные скобки. По умолчанию инструкции выполняются в порядке записи. Как правило, последовательного выполнения недостаточно для решения реальных задач. Специальные управляющие конструкции позволяют менять порядок действий в зависимости от некоторых условий и повторять составную инструкцию определенное количество раз. Инструкции if, if-else и switch обеспечивают условное выполнение. Повторение обеспечивается инструкциями цикла while, do-while и for.

5.1. Простые и составные инструкции

Простейшей формой является пустая инструкция. Вот как она выглядит:

Code
; // пустая инструкция

Пустая инструкция используется там, где синтаксис С++ требует употребления инструкции, а логика программы – нет. Например, в следующем цикле while, копирующем одну строку в другую, все необходимые действия производятся внутри круглых скобок (условной части инструкции). Однако согласно правилам синтаксиса С++ после while должна идти инструкция. Поскольку нам нечего поместить сюда (вся работа уже выполнена), приходится оставить это место пустым:

Code
while ( *string++ = inBuf++ )
; // пустая инструкция

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

Code
ival = dval + sval;; // правильно: лишняя пустая инструкция

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

Code
// простые инструкции
int ival = 1024; // инструкция определения переменной
ival; // выражение
ival + 5; // еще одно выражение
ival = ival +5; // присваивание

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

Code
if ( ival0 > ival1 ) {
     // составная инструкция, состоящая
     // из объявления и двух присваиваний
     int temp = ivalO;
     ivalO = ival1;
     ival1 = temp;
}

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

Code
while ( *string++ = *inBuf++ )
{} // пустая инструкция

Составную инструкцию, содержащую определения переменных, часто называют блоком. Блок задает локальную область видимости в программе – идентификаторы, объявленные внутри блока (как temp в предыдущем примере), видны только в нем. (Блоки, области видимости и время жизни объектов рассматриваются в главе 8.)
--------------------------------------------------------------------------------------------------------------------------------------- ------------------------------

5.2. Инструкции объявления

В С++ определение объекта, например

Code
int ival;

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

Code
#include <fstream>
#include <string>
#include <vector>
int main()
{
    string fileName; // #1
    cout << "Введите имя файла: ";
    cin >> fileName;
    if ( fileName.empty() ) {
       // странный случай
       cerr << "Пустое имя файла. Завершение работы.\n";
       return -1;
    }
    ifstream inFile( fileName.c_str() ); // #2
       if ( ! inFile ) {
       cerr << "Невозможно открыть файл.\n";
       return -2;
    }

    string inBuf; // #3
    vector< string > text; // #4
    while ( inFile >> inBuf ) {
       for ( int ix = 0; ix < inBuf .size(); ++ix ) // #5
          // можно обойтись без ch,
          // но мы использовали его для иллюстрации
          if (( char ch = inBuf[ix] )=='.'){ // #6
             ch = '_';
             inBuf[ix] = ch;
          }
          text.push_back( inBuf );
    }
    if ( text.empty() )
       return 0;
    // одна инструкция объявления,
    // определяющая сразу два объекта
    vector<string>::iterator iter = text.begin(), // #7
          iend = text.end();
    while ( iter != -iend ) {
       cout << *iter << '\n';
       ++iter;
    }
   return 0;
}

Программа содержит семь инструкций объявления и восемь определений объектов. Объявления действуют локально; переменная объявляется непосредственно перед первым использованием объекта.
В 70-е годы философия программирования уделяла особое внимание тому, чтобы определения всех объектов находились в начале программы или блока, перед исполняемыми инструкциями. (В С, например, определение переменной не является инструкцией и обязано располагаться в начале блока.) В некотором смысле это была реакция на идиому использования переменных без предварительного объявления, чреватую ошибками. Такую идиому поддерживал, например, FORTRAN.
Поскольку в С++ объявление является обычной инструкцией, ему разрешено появляться в любом месте программы, где допустимо употребление инструкции, что дает возможность использовать локальные объявления.
Необходимо ли это? Для встроенных типов данных применение локальных объявлений является скорее вопросом вкуса. Язык их поощряет , разрешая объявлять переменные внутри условных частей инструкций if, if-else, switch, while, for. Те программисты, которые любят этот стиль, верят, что таким образом делают свои программы более понятными.
Локальные объявления становятся необходимостью, когда мы используем объекты классов, имеющие конструкторы и деструкторы. Если мы помещаем все объявления в начало блока или функции, происходят две неприятные вещи:

  • конструкторы всех объектов вызываются перед исполнением первой инструкции блока. Применение локальных объявлений позволяет “размазать” расходы на инициализацию по всему блоку;
  • что более важно, блок или функция могут завершиться до того, как будут действительно использованы все объявленные в начале объекты. Скажем, наша программа из предыдущего примера имеет два аварийных выхода: при вводе пользователем пустого имени файла и при невозможности открыть файл с заданным именем. При этом последующие инструкции функции уже не выполняются. Если бы объекты inBuf и next были объявлены в начале блока, конструкторы и деструкторы этих объектов в случае ненормального завершения функции вызывались бы совершенно напрасно.

    Инструкция объявления может состоять из одного или более определений. Например, в нашей программе мы определяем два итератора вектора в одной инструкции:

    Code
    // одна инструкция объявления,
    // определяющая сразу два объекта
    vector<string>::iterator iter = text.begin(),
           lend = text.end();

    Эквивалентная пара, определяющая по одному объекту, выглядит так:

    Code
    vector<string>::iterator iter = text.begin();
    vector<string>::iterator lend = text.end();

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

    // то ли хотел определить программист?

    Code
    string *ptrl, ptr2;

    Эквивалентная пара инструкций не позволит допустить такую ошибку:

    Code
    string *ptr1;
    string *ptr2;

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

    Code
    int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0;
    int charCnt=0, wordCnt=0;

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



  • Собираю не + а МИНУСА! P.s "+" за мою работу не ставить!! Только МИНУСА

    Сообщение отредактировал Минусочег - Четвер, 13.01.2011, 08:43
     
    • Сторінка 1 з 1
    • 1
    Пошук:

    Новые сообщения в темах
    Сдам в аренду сервер и хостинг · (Хост Предложения)
    Автор: redlaine
    Последнее сообщение в 23:53
    хаха :D · (Приколы)
    Автор: [N1ke]Medved
    Последнее сообщение в 18:40
    Autobattle - новый боевой бот ... · (Боты для WoW)
    Автор: terrikon
    Последнее сообщение в 18:39
    PvE руководство для Чернокнижн... · (Чернокнижник)
    Автор: Darkensand
    Последнее сообщение в 18:38
    Пустой свиток (Часть 11) · (Истории WoW)
    Автор: R_a_Z_o_R
    Последнее сообщение в 18:37
    Друиды в Катаклизме: Официальн... · (Друид)
    Автор: Darkensand
    Последнее сообщение в 18:37
    [Баг 3.3.5] Фарм ледяных бадже... · (Читы для WoW)
    Автор: Darkensand
    Последнее сообщение в 18:35
    FarmBot (Бот для фарма руды и ... · (Боты для WoW)
    Автор: homma
    Последнее сообщение в 18:34
    Почему мы сражаемся: ролевая и... · (Воин)
    Автор: Darkensand
    Последнее сообщение в 18:34
    Книги по Wold of Warcraft · (Истории WoW)
    Автор: R_a_Z_o_R
    Последнее сообщение в 18:33
    Маг огня в Cataclysm · (Маг)
    Автор: Darkensand
    Последнее сообщение в 18:33
    Как начать играть в World of W... · (Полезно знать)
    Автор: Belkmondesh
    Последнее сообщение в 18:32
    Характеризация профессий · (Профессии)
    Автор: Darkensand
    Последнее сообщение в 18:31
    Что значит для арканов бета те... · (Маг)
    Автор: Darkensand
    Последнее сообщение в 18:31

    Контакты Контакты Copyright WoW-Info — World of Warcraft портал © 2025 | Условия и правила использования ресурса | Реклама / Услуги
    WoW-Info портал.World of Warcraft портал — готовые сервера, сайты, картинки, аддоны, патчи, читы, баги, mangos, ArcEmu, TrinityCore, Warcraft 3, новости, Cataclysm...
    Яндекс.Метрика Хостинг від uCoz