4863

Структура программы C++. Служебные слова. Комментарии. Базовые типы данных и операции над ними

Лекция

Информатика, кибернетика и программирование

Структура программы C++. Служебные слова. Комментарии. Базовые типы данных и операции над ними. Логические операции. Побитовые операции. Преобразование типов. Базовый ввод, вывод. Служебные слова. Язык С++ имеет набор зарезервированных служебных сло...

Русский

2012-11-28

75.5 KB

68 чел.

Структура программы C++. Служебные слова. Комментарии. Базовые типы данных и операции над ними. Логические операции. Побитовые операции. Преобразование типов. Базовый ввод, вывод.

Служебные слова.

Язык С++ имеет набор зарезервированных служебных слов, являющихся «фундаментом» языка и не допустимых к использованию для каких-либо иных целей:

 asm        continue     float    new          signed      try

 auto       default      for      operator     sizeof      typedef

break      delete       friend   private      static      union

case       do           goto     protected    struct      unsigned

catch      double       if       public       switch      virtual

char       else         inline   register     template    void

class      enum         int      return       this        volatile

const      extern       long     short        throw       while

Все эти слова будут выделены в текстовом редакторе MSVS.

Комментарии, т.е. не подлежащие трансляции текстовые вставки в исходном коде С++ организуются с помощью операторов //:

// Однострочный комментарий

Текст, следующий за оператором // до конца строки считается комментарием. Многострочные комментарии организуются с помощью пары операторов /* и */:

/*

  Многострочный

  комментарий

*/

Текст, расположенный между /* и */ считается комментарием и игнорируется при трансляции, поэтому с их помощью можно сделать «вставку» и внутри инструкции, например:

int /* комментарий */ main()

Базовые типы данных.

В С++ имеется несколько основных «встроенных» типов данных, соответствующих базовым машинным типам:

char – целочисленный тип размерности 1 байт, также может интерпретироваться как символ;

int целочисленный тип, обычно соответствующий размерности слова на используемой машине;

short – целочисленный тип не большей размерности, чем int;

long – целочисленный тип не меньшей размерности, чем int;

bool – логический тип, имеющий 2 возможных значения: true (логическая единица, «истина») или false (логический ноль, «ложь» );

float – тип чисел с плавающей точкой одинарной точности;

double – тип чисел с плавающей точкой двойной точности.

Кроме того, определен модификатор long, соответствующий типу увеличенной размерности по отношению к базовому. Допустимо использование этого модификатора для int, long, float, double.

Фактическая размерность всех базовых типов, кроме char, не фиксирована строго, а определяется исходя из аппаратных особенностей и эффективности машинной реализации операций на используемом компьютере. Например, вполне может оказаться, что размерность типов int и long одинакова. Фактическую размерность любого базового типа Т  можно определить с помощью функции sizeof(T).

Помимо этого, для целочисленных типов определена также специальная пара модификаторов для указания, входят ли в диапазон значений типа отрицательные числа:

unsigned (беззнаковый) – указывает, что в область значений данного типа не входят отрицательные числа, т.е. дополнительный бит под знак не резервируется;

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

Информация о размерности и диапазонах допустимых значений базовых типов описывается в стандартном файле limits.h.

Литералы – константные значения, описанные в тексте программы, бывают следующих видов:

  •  целая константа
  •  символьная константа
  •  константа с плавающей точкой
  •  строка литералов

Все целые константы, состоящие из последовательности цифр, считаются десятичными (основание счисления десять), если только они не начинаются с 0. Последовательность цифр, начинающаяся с 0, считается восьмеричным целым (основание счисления восемь). Цифры 8 и 9 не являются восьмеричными. Последовательность цифр, начинающаяся с 0x или 0X, считается шестнадцатеричным целым (основание счисления шестнадцать). Шестандцатеричные цифры могут состоять из символов от a или A до f или F с десятичными значениями их от десяти до пятнадцати. Например, число двенадцать можно записать как 12, 014 или 0XC.

Тип целой константы определяется ее представлением, значением и окончанием. Если она десятичная и не имеет окончания, ее тип будет первым подходящим для ее значения из следующих типов: int, long int, unsigned long int. Если она восьмеричная или шестнадцатеричная и не имеет окончания, ее тип будет первым подходящим для ее значения из следующих: int, unsigned int, long int, unsigned long int. Если она оканчивается символом u или U, ее тип будет первым подходящим для ее значения из следующих: unsigned int, unsigned long int. Если она оканчивается символом l или L, ее тип будет первым подходящим для ее значения из следующих: long int, unsigned long int. Если она оканчивается на ul, lu, uL, Lu, Ul, lU, UL или LU, ее типом будет unsigned long int.

Символьной константой является один или несколько символов, заключенные в одиночные кавычки, например 'x'. Константа из одного символа имеет тип char. Значение константы из одного символа есть порядковый номер символа в таблице кодировки символов на данной машине.

Некоторые символы, не имеющие графического представления, как одиночная кавычка ', двойная кавычка ", знак вопроса ?, обратная дробная черта \, можно представлять комбинацией символов (начинающейся с \) в соответствии с приводимой ниже таблицей:

    конец строки                         NL (LF)   \n

    горизонтальная табуляция       HT        \t

    вертикальная табуляция         VT        \v

    возврат каретки                CR        \r

    обратная дробная черта         \          \\

    знак вопроса                    ?          \?

    одиночная кавычка              '          \'

    двойная кавычка                "          \"

Константы с плавающей точкой состоят из целой части, символа точка, дробной части, e или E, целого показателя с возможным знаком и возможным окончанием, указывающим тип. Целая и дробная части состоят из последовательности десятичных (основание счисления десять) цифр. Или целая часть, или дробная часть (но не обе) могут отсутствовать. Или точка, или символ e (или E) вместе с показателем могут отсутствовать (но не оба). Тип константы с плавающей точкой есть double, если только он не задан явно с помощью окончания. Окончания f или F задают тип float, окончания l или L задают тип long double.

Строка литералов – это последовательность символов, заключенная в двойные кавычки, т.е. "...". Строка имеет тип "массив символов", инициализированный заданными символами. Соседние строки литералов конкатенируются. После всех необходимых конкатенаций к строке добавляется символ '\0', чтобы программа, читающая строку, могла определить ее конец. Размер строки равен числу всех ее символов, включая символ завершитель строки. Внутри строки перед символом двойной кавычки " должен идти символ \.

Переменные.

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

  •  r-значение (r-value, от read value) – читаемое значение – значение переменной, которое хранится в памяти. r-значение имеют как литерал, так и переменные.
  •  l-значение (l-value, от location value) – значение местоположения – место, где хранится r-значение. l-значением обладают только переменные, а литералы его не имеют.

Например, в выражении

i = i + 10;

переменная i находится и слева, и справа от оператора присваивания. При этом справа подразумевается её r-значение (т.е. из памяти читается значение этой переменной), а слева – l-значение (в область памяти, связанную с переменной i помещается результат операции присваивания.

Таким образом, следующие выражения недопустимы:

2 = 3; // ошибка, литерал 2 не имеет l-значения

a + b = c; // ошибка, выражение a + b не имеет l-значения

Оператор определения переменной имеет вид:

 

тип имя;

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

Рассмотренный вариант определения переменной не задает её начального значения. В этом случае, значением переменной будет «мусор», находящийся в выделенном для нее участке памяти. Переменную в таком состоянии называют неинициализированной, а присваивание начального значения – инициализацией. Часто встречающаяся ошибка заключается в попытке использования неинициализированной переменной. Начальное значение может быть определено сразу в операторе присваивания в двух эквивалентных формах:

int i = 0;

double d(0.5);

Выражения.

Выражение состоит из одного или более операндов, в простейшем случае – из одного литерала или переменной. Результатом выражения является r-значение его операнда. Как правило, выражение содержит несколько операндов и операций, применяемых к ним. Операции обозначаются соответствующими знаками. Операции, применяемые к одному операнду, называют унарными (например, унарный минус: -5), а применяемые к двум операндам – бинарными (например, сложение: 2 + 2). Один и тот же оператор может обозначать унарную или бинарную операцию, в зависимости от того, к какому количеству операндов он применяется. Тип результата выражения определяется типами операндов. Если операнды имеют разный тип, производится преобразование типов в соответствии с определенными правилами.

Арифметические операции:

* (умножение), / (деление), % (остаток от деления), + (сложение),- (вычитание).

Деление двух целых чисел дает целое число. Дробная часть результата (если она есть), отбрасывается. Например, результатом выражения 1 / 2 будет 0. 

Операция остаток от деления (деление по модулю) применяется только к операндам целого типа.

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

Стандартная библиотека С++ имеет специальный заголовочный файл (limits.h), содержащий информацию о встроенных типах данных, в том числе, диапазоны возможных значений.

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

 

Операции сравнения и логические операции:

 !  логическое НЕ (унарная операция): ! a

 <  меньше     a < b 

 <= меньше либо равно    a <= b

 >  больше     a > b

 >=  больше либо равно    a >= b

 == равно (сравнение)    a == b

 !=  не равно     a != b

 && логическое И     a && b

 || логическое ИЛИ    a || b

 

Эти операторы в качестве результата возвращают логическое (булевское, bool) значение, т.е true или false. Если такое выражение встречается в контексте, где требуется целочисленное значение, true преобразуется в 1, а false в 0.

Побитовые операторы.

~ побитовое НЕ (унарная операция)  ~ a

<<  сдвиг влево     a << b

>>  сдвиг вправо     a >> b

& побитвое И     a & b

^  побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ a ^ b

| побитовое ИЛИ    a | b

Побитовые операции рассматривают аргументы как упорядоченные наборы битов (последовательности из 0 и 1). Такие операции позволяют манипулировать значениями отдельных битов.

Побитовое НЕ (~) меняет значение каждого бита своего операнда на противоположное.

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

Побитовые И, ИЛИ и ИСКЛЮЧАЮЩЕЕ ИЛИ применяют соответствующую булевскую операцию к каждому биту своих операндов.

Операции присваивания.

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

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

+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=

Таким образом, следующие два выражения эквивалентны:

a = a + 5;

a += 5;

Операции инкремента и декремента.

Операции инкремента ++ и декремента -- используются в качестве компактной формы записи изменения значения на единицу. Оба оператора допускают две формы:

a++постфиксная форма: значение аргумента a увеличивается после того, как её текущее значение использовано в соответствующем выражении.

++aпрефиксная форма: текущее значение сначала изменяется (увеличивается для ++ или уменьшается для --  соответственно), а затем новое значение используется в выражении.

Приоритеты операций.

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

++, --, ~, !, - (унарный), *, /, %, +, - (бинарный), <<, >>, <, <=, >, >=, ==, !=, &, ^, |, &&, ||, =, составные операторы присваивания.

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

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

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

double d = 6.751;

int j = d; // j получает значение 6

    int i = d + 0.5; // i получает значение 7

При необходимости, нужно пользоваться явным приведением типов:

int i = 3;

   double d = i / 5; // d получает 0, т.к. выполняется

                       // целочисленное деление 3 / 5

   double x = static_cast< double >( i ) / 5; // х получает 

// значение 0.6

Базовый ввод-вывод.

Ввод-ввыод в консольных приложениях обеспечивается использованием части стандартной библиотеки (iostream). Для вывода информации в консоль применяется предопределенный объект cout, представляющий стандартный поток вывода и, как правило, связный с выводом в консоль. Как и другие сущности стандартной библиотеки, cout определен в пространстве имен std. Самый простой способ использования cout обеспечивается применением оператора форматированного вывода <<.

int i = 10;

    std::cout << i;

Оператор << умеет работать со всеми встроенными типами данных. Кроме того, он предоставляет возможность «сцепки» нескольких вызовов в одном выражении:

int i = 10;

   double d = 3.3;

   std::cout << "Значение i: " << i << ", значение d: " << d;

 Для перевода строки в консоли удобно пользоваться объектом endl (от end line):

 double a = 2.2, b = 3.3;

   std::cout << "a + b = " << ( a + b ) << std::endl;

 Чтобы избежать многократного явного указания используемого пространства имен std, можно указать использовать директиву using, дав указание компилятору искать неизвестные объекты в нужном пространстве имен:

using namespace std;

 

double a = 2.2, b = 3.3;

   cout << "a + b = " << ( a + b ) << endl;

Аналогично, для ввода из стандартного потока ввода (как правило – консоли), используется предопределенный объект cin, реализующий операцию ввода >>

int i;

   double d;

   cin >> i >> d;

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


 

А также другие работы, которые могут Вас заинтересовать

62717. Народні традиції, родинні свята і здоров’я. «Як влаштувати веселе свято?» 253.63 KB
  Мета: навчити дітей розуміти значення народних традицій для здоровя; формувати прагнення дбати про власне здоровя; розвивати мислення память; виховувати повагу до народних традицій. Діти скажіть мені коли ви смієтесь найчастіше...
62718. Физическая составляющая здоровья 19.04 KB
  Цель: расширить представление о физической составляющей здоровья; Раскрыть понятие гармоничное развитие человека; учить детей оценивать свое физическое здоровье; объяснить влияние осанки формы стопы на здоровье...
62719. Непроизносимые согласные в корне 50.89 KB
  Планируемые результаты: Предметные: умение правильно писать слова с непроизносимыми согласными; умение видеть непроизносимые согласные ЛТВД в корне по опознавательным признакам: умение различать проверочное и проверяемое слова...
62723. Возникновение банков и становление банковских систем 2.51 MB
  История возникновения банковского дела уводит нас в далёкую древность и начинается она с государств Древнего Востока Вавилона Египта. Древнейшими банковскими операциями были также хранение и транспортировка...