Основные понятия языка С/С++

1 Лекция №1
  1.  ВВЕДЕНИЕ В ЯЗЫК С/С++.

ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА С/С++

1.1. Введение

  Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько «близок к машине», что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким умыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько «близок к решаемой задаче», чтобы концепции ее решения можно было выражать прямо и коротко. С таким умыслом предварительно задумывались средства, добавленные к C для создания С++.

 Название С++ выдумал Рик Масситти (лето 1983-его). Более ранние версии языка использовались, начиная с 1980-ого, и были известны как «C с Классами».   Язык С++, как и С , удобен для написания операционных систем(ОС), поэтому его называют языком системного программирования. Так, например, операционная система UNIX и ее программное обеспечение написаны на С.

  С++ был развит из языка программирования C и за очень немногими исключениями сохраняет C как подмножество. Базовый язык C, подмножество С++, спроектирован так, что имеется очень близкое соответствие между его типами, операциями и операторами и компьютерными объектами, с которыми непосредственно приходится иметь дело: числами, символами и адресами. За исключением операций свободной памяти new и delete, отдельные выражения и операторы С++ обычно не нуждаются в скрытой поддержке во время выполнения или подпрограммах.

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

  Одним из первоначальных предназначений C было применение его вместо программирования на ассемблере в самых насущных задачах системного программирования. Когда проектировался С++, были приняты меры, чтобы не ставить под угрозу успехи в этой области. Различие между C и С++ состоит в первую очередь в степени внимания, уделяемого типам и структурам. C выразителен и снисходителен. С++ еще более выразителен, но чтобы достичь этой выразительности, программист должен уделить больше внимания типам объектов. Когда известны типы объектов, компилятор может правильно обрабатывать выражения, тогда как в противном случае программисту пришлось бы задавать действия с мучительными подробностями. Знание типов объектов также позволяет компилятору обнаруживать ошибки, которые в противном случае остались бы до тестирования. Заметьте, что использование системы типов для того, чтобы получить проверку параметров функций, защитить данные от случайного искажения, задать новые операции и т.д., само по себе не увеличивает расходов по времени выполнения и памяти.

  Особое внимание, уделенное при разработке С++ структуре, отразилось на возрастании масштаба программ, написанных со времени разработки C. Маленькую программу (меньше 1000 строк) вы можете заставить работать с помощью грубой силы, даже нарушая все правила хорошего стиля. Для программ больших размеров это не совсем так. Если программа в 10 000 строк имеет плохую структуру, то вы обнаружите, что новые ошибки появляются так же быстро, как удаляются старые. С++ был разработан так, чтобы дать возможность разумным образом структурировать большие программы таким образом, чтобы для одного человека не было непомерным справляться с программами в 25 000 строк. Существуют программы гораздо больших размеров, однако те, которые работают, в целом, как оказывается, состоят из большого числа почти независимых частей, размер каждой из которых намного ниже указанных пределов. Естественно, сложность написания и поддержки программы зависит от сложности разработки, а не просто от числа строк текста программы, так что точные цифры, с помощью которых были выражены предыдущие соображения, не следует воспринимать слишком серьезно.

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

   Из всего сказанного следует, что язык программирования C++ - это C*, расширенный введением классов, inline-функций, перегруженных операций, перегруженных имен функций, константных типов, ссылок, операций управления свободной памятью, проверки параметров функций. Коротко различия между С++ и «старым С»:

- Типы параметров функции могут быть заданы  и будут проверяться. Могут выполняться преобразования типов;

- Для выражений с числами с плавающей точкой может использоваться плавающая арифметика одинарной точности;.

- Имена функций могут быть перегружены;

- Операции могут быть перегружены;

- Может осуществляться inline-подстановка функций;

- Объекты данных могут быть константными (const);

- Могут быть описаны объекты ссылочного типа;

- Операции new и delete обеспечивают свободное хранение в памяти;

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

- Имя класса является именем типа;

  •  Любой указатель может присваиваться [указателю] void* без приведения типа.

1.2. ОСНОВНЫЕ ПОНЯТИЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ C/С++

1.2.1. АЛФАВИТ ЯЗЫКА

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

 В алгоритмическом языке программирования имеются аналогичные структурные элементы:

1) Символы языка - это элементарные знаки, используемые для составления любых текстов. Hабор таких символов называют алфавитом языка.

2)Слово - последовательность символов.

3)Выражение - группа слов.

4)Оператор -определенная комбинация слов и  выражений.

Множество символов используемых в языке С++ можно разделить на пять групп.

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

Таблица 1 

Прописные буквы латинского алфавитаA B C D E F G H I J K L M N O P Q R S T U V W X Y ZСтрочные буквы латинского алфавитаa b c d e f g h i j k l m n o p q r s t u v w x y zСимвол подчеркивания_

2. Группа прописных и строчных букв русского алфавита и арабские цифры (табл.2).

Таблица 2 

Прописные буквы русского алфавитаА Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Ь Э Ю ЯСтрочные буквы русского алфавитаа б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю яАрабские цифры0 1 2 3 4 5 6 7 8 9

3. Знаки нумерации и специальные символы (табл. 3). Эти символы используются с одной стороны для организации процесса вычислений, а с другой - для передачи компилятору определенного набора инструкций.

Таблица 3 

СимволНаименованиеСимволНаименование,запятая)круглая скобка правая.точка(круглая скобка левая;точка с запятой}фигурная скобка правая:двоеточие{фигурная скобка левая?вопросительный знак<меньше'апостроф>больше!восклицательный знак[квадратная скобка|вертикальная черта]квадратная скобка/дробная черта#номер\обратная черта%процент~тильда&амперсанд*звездочка^логическое не+плюс=равно-мину«кавычки

4. Управляющие и разделительные символы. К этой группе символов относятся: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка. Эти символы отделяют друг от друга объекты, определяемые пользователем, к которым относятся константы и идентификаторы. Последовательность разделительных символов рассматривается компилятором как один символ (последовательность пробелов).

5. Кроме выделенных групп символов в языке С++ широко используются так называемые, управляющие последовательности ( или ESCAPE-последовательности), т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность строится на основе использования обратной  дробной черты (\) (обязательный первый символ) и комбинацией латинских букв и цифр (табл.4).

Таблица 4 

Управляющая последовательностьНаименованиеШеснадцатеричная замена\aЗвонок007\bВозврат на шаг008\tГоризонтальная табуляция009\nПереход на новую строку00A\vВертикальная табуляция00B\rВозврат каретки00C\fПеревод формата00D\»Кавычки022\'Апостроф027\0Ноль-символ000\\Обратная дробная черта05C\dddСимвол набора кодов ПЭВМ в восьмеричном представлении \xdddСимвол набора кодов ПЭВМ в шестнадцатеричном представлении 

Последовательности вида \ddd и \xddd (здесь d обозначает цифру) позволяет представить символ из набора кодов ПЭВМ как последовательность восьмеричных или шестнадцатеричных цифр соответственно. Например, символ возврата каретки может быть представлен различными способами:

\r - общая управляющая последовательность,

\015 - восьмеричная управляющая последовательность,

\x00D - шестнадцатеричная управляющая последовательность.

1.2.2. ДОГОВОРЕННОСТИ О ЛЕКСИКЕ

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

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

Есть шесть классов лексем: идентификаторы(имена), ключевые слова, константы, строки, операторы и прочие разделители(см. табл.3), такие как квадратные скобки ([]), фигурные скобки ({}),  угловые  скобки  (<>),круглые  скобки и запятые. Границы лексем определяются пробельными символами и другими лексемами, такими как операции и знаки пунктуации. Чтобы предупредить неправильную работу компилятора, запрещаются пробельные символы между символами идентификаторов, операциями, состоящими из нескольких символов, кроме операции присваивания, и символами ключевых слов. Количество пробелов, являющихся границами лексем, не  является значащим, там, где можно поставить один пробел,  можно  поставить их сколько угодно:

с=2+2;       и с=  2      + 2;  для компилятора эквивалентны.

1.2.2.1 Комментарии

    Комментарий – подсказка, которую пользователь( или разработчик какого-то программного продукта) вносит в текст программы для облегчения понимания  текста данной программы.

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

Пример: /* Задание1 */   В данном случае комментарий занимает некоторую часть строки  ( на этой же строке можно продолжать написание части программы, которая уже не будет относиться к комментариям).

          или /* Задание 1               Все, что будет находиться в этой строке, считается комментарием.

                 Выполнено */          А здесь уже нет.

              //     Вся строка комментарий.

Допускается вставка комментариев в описания переменных, констант, в  выражения и т.д. Пример:

int /*объявление*/ i /* целого типа*/;

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

Пример:

int /*объявление*/ k =р//* деление на а*/ а;

+с;

В данном примере знак деления, т.к. он не отделен пробелом от начала комментария вида /*, будет отнесен к  началу комментария вида //, и результат примет вид int k =р+с;

1.2.2.2 Идентификаторы (имена)

    Идентификатор – произвольное имя любой длины, определяемое пользователем. Представляет собой последовательность латинских букв(от А до Z или от a до z), цифр(от 0 до 9) и знака подчеркивания ( _ ). Может начинаться с буквы или  знака подчеркивания ; буквы в верхнем и нижнем регистрах являются различными.

    Два идентификатора, для образования которых используются совпадающие строчные и прописные буквы, считаются различными. Например: abc, ABC, A128B, a128b .

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

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

Число значимых символов не может быть увеличено, но может быть уменьшено при помощи меню или опций командной строки: опция  -In TCC или опцией меню O|C|S|Identifier Length (?).

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

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

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

1.2.2.3 Ключевые слова

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

 asm           auto        break      case         char         class     const

              continue    default    delete     do            double     else       enum      

              extern     float        for          friend       goto        if           inline  

              int             long         new        operator  overload  public    register  

              return        short       sizeof      static        struct      switch    this

typedef     union      unsigned  virtual      void       while

Идентификаторы signed и volatile зарезервированы для применения в будущем.

1.2.2.4 Элементы данных

       К основным  элементам  данных  относятся константы и переменные.

        Они бывают локальные(местные) и глобальные. Переменные и постоянные, описанные внутри функций, называются локальными  и  существуют  только  при работе объявляющих их функций.  Переменные и константы (постоянные), объявленные вне функций, называются глобальными.  Среди глобальных переменных и постоянных не может быть двух с одинаковыми именами, а локальные могут дублировать глобальные имена и имена  друг друга(при этом обращение к таким именам внутри подпрограмм соответствуют обращениям к локальным переменным и постоянным, а вне их - к глобальным.  Локальные  и  глобальные  переменные и константы  хранятся в разных местах и даже при одинаковых значениях не влияют друг на друга. Глобальная переменная хранится в сегменте данных ( размер 63кб). Если этого мало, то используются ссылки и динамические переменные.  Локальные переменные существуют только при  работе  объявляющих функций и хранят свои значения в специальной области памяти – стеке. По умолчанию размер стека = 16кб (это максимальный объем всех локальных переменных, работающих одновременно). После работы подпрограммы ее локальные переменные освобождают стек.

1.2.2.4.1 Константы

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

Константы бывают:

  1.  типизированные ( с указанием типа константы);
  2.  нетипизированные (без указания типа константы).

Их можно описать двумя способами:

  1.  при помощи модификатора  const - для типизированных;
  2.  при помощи  директивы #define( использование макроса, см.#) – для нетипизированных.

Форма записи:

Const  СпецификаторТипа   <ИмяПеременной1=Значение1, …,ИмяПеременнойN=ЗначениеN>;

#define Идентификатор_макроса  <Последовательность_лексем> (подробнее см. . #)

В качестве значения может использоваться:

  1.  непосредственно число указанного типа;
  2.   простое выражение, допустимое для заданного типа данных( допускается использовать в них описанные ранее константы или переменные со стартовым значением (см. #2.2.4.2)).

Примеры:

     const int I=6, j=3+2*4, k=I*j+5;

     #define h  3;

     #define m  3*h+k;

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

Примеры:

const float  pi= 3.1415926; //константа плавающего типа

const maxint = 32767; //целочисленная константа

const mas[5]={7,9,3,5,2}; //массив констант

char  *const str= “Hello, world!”; // указатель константа

char const *str2=  «Hello,  world!»;  //  указатель  на константу

и

#define  nil “”;

#define  n   7*2-2; “”;

С учетом этого, следующие операторы являются недопустимыми:

pi= 3.0; /* присвоение значения константе pi */

i= maxint++; /* инкремент константы  maxint*/

str = «Hi,  there!»;  /*  установка  указателя  str  на что-то еще*/

Однако, отметим,   что  вызов  функции  strcpy(str,»Hi, there!») является допустимым,  поскольку он выполняет посимвольное  копирование  из строкового литерала «Hi,  there!» в адрес памяти, указываемый str.

В С++ const также «скрывает» объект const и  предотвращает  внешнюю компоновку.  При необходимости нужно использовать extern const. Указатель на const не может быть присвоен указателю на не const (в противном случае значению const могло было быть выполнено присвоение при помощи указателя на не  const.)

Например,

char str3 = str2  / запрещено */

В зависимости от типов данных константы бывают следующих видов:

целые;

с плавающей точкой;

символьные;

строковые;

перечислимые.

1.2.2.4.2 Переменные

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

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

Форма записи:

СпецификаторТипа   <ИмяПеременной1, …, ИмяПеременнойN>;

или для переменных со стартовым значением

   СпецификаторТипа   <ИмяПеременной1=Значение1, …, ИмяПеременнойN=ЗначениеN>;

Как и для констант в качестве стартового значения могут быть:

  1.  непосредственно число указанного типа;

     2) простое выражение, допустимое для заданного типа данных( допускается использовать в них описанные ранее константы или переменные со стартовым значением (см. #2.2.4.2)).

  Примеры:

         float X;

         double A,B;

         int i, j=0,k=7+j, m=k*2+5;

         char znak=’=’;

Модификатор volatile

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

Пример:

volatile int ticks;

interrupt timer()

{

ticks++;

}

wait(int interval)

{

ticks=0;

while (ticks<interval);

}

  Эти подпрограммы (предполагается, что timer правильно связана с аппаратным прерыванием часов) реализуют выдержку по времени между «тиканьем» часов, заданную аргументом interval. Высоко оптимизированный компилятор не может загружать значение ticks в проверку выхода из цикла while, т.к. цикл не изменяет значение  ticks.  

2. ПРОСТЫЕ ТИПЫ ДАННЫХ 

Тип - множество значений, которые могут принимать объекты  программы, и совокупность операций, допустимых над  этими  значениями.

Тип используется для

-  определения требуемого количества памяти при ее исходном распределении,

-  интерпретации битовых кодов, находимых в объектах при последующих к ним обращениях,

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

Таксономия типа

Существует четыре базовые категории типа: void, scalar, function, aggregate. Тип Scalar  подразделяется на арифметический, перечислимый, указатель и в С++ ссылки. Тип Aggregate подразделяется на массив, структуру, объединение и класс. Простые типы называют также фундаментальными, а сложные – производными

2.1. Целый тип данных

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

Таблица 5 

ТипРазмер памяти в байтахДиапазон значенийНазвание типаchar1от –128 до 127СимвольныйintДля IBM XT,AT,SX,DX 2 Целыйshort2от -32768 до 32767Короткий целыйlong4от -2 147 483 648 до 2 147 483 647Длинный целыйunsigned сhar1oт 0 до 255Символьный без знакаunsigned intДля IBM XT,AT,SX,DX 2 Целый без знакаunsigned short2от 0 до 65535Короткий целый без знакаunsigned long4от 0 до 4 294 967 295Длинный целый без знака

Отметим, что ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Целые без знака, описываемые как unsigned, подчиняются правилам арифметики по модулю 2n, где n - число бит в их представлении.

     Например:

          unsigned int n;

          unsigned int b;     int c;   (подразумевается  signed   int c  );

          unsigned d;   (подразумевается  unsigned int d  );

          signed f;     (подразумевается  signed   int f  ).

Следует сделать следующее замечание: в языке С++ не определено представление в памяти и диапазон значений для идентификаторов с модификаторами типа int и unsigned int. Размер памяти для переменной с модификатором типа signed int определяется длиной машинного слова, которое имеет различный размер на разных машинах. Так, на 16-ти разрядных машинах размер слова равен 2-м байтам, на 32-х разрядных машинах соответственно 4-м байтам, т.е. тип int эквивалентен типам short int, или long int в зависимости от архитектуры используемой ПЭВМ. Таким образом, одна и та же программа может правильно работать на одном компьютере и неправильно на другом. Для определения длины памяти занимаемой переменной можно использовать операцию sizeof языка С++, возвращающую значение длины указанного модификатора-типа.

       Например:

a = sizeof(int);  b = sizeof(long int);c = sizeof(unsigned long);  

Константы целого типа

Целая константа: это десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.

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

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

Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шестнадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

Примеры целых констант:

        Десятичная      Восьмеричная       Шестнадцатеричная

        константа            константа                  константа

            16                         020                            0x10

           127                       0117                           0x2B

           240                       0360                           0XF0

Если требуется сформировать отрицательную целую константу, то используют знак ‘-‘ перед записью константы (который будет называться унарным минусом). Например: -0x2A, -088, -16 .

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

• десятичные константы рассматриваются как величины со знаком, и им присваивается тип int (целая) или long (длинная целая) в соответствии со значением константы. Если константа меньше 32768, то ей присваивается тип int в противном случае long.

• восьмеричным и шестнадцатеричным константам присваивается тип int, unsigned int (беззнаковая целая), long или unsigned long в зависимости от значения константы согласно табл 6.

Таблица 6 

Диапазон шестнадцатеричных константДиапазон восьмеричных константТип0x0 - 0x7FFF0 - 077777int0X8000 - 0XFFFF0100000 - 0177777unsigned int0X10000 - 0X7FFFFFFF0200000 - 017777777777long0X80000000 - 0XFFFFFFFF020000000000 - 037777777777unsigned long

Для того чтобы любую целую константу определить типом long, достаточно в конце константы поставить букву «l» или «L».

     Пример: 5l, 6l, 128L, 0105L, OX2A11L.

Отметим также, что восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned. Это достигается указанием префикса u или U после константы, константа без этого префикса считается знаковой. Если  Константы с указанным префиксом называются явно заданными.

     Например:

         const I= 0xA8C;   // константа типа int  signed   

    const L= 01786l; //  константа типа long signed   

    int u= 0xF7u;  // переменная типа int  unsigned 

            

Символьная константа

Символьная константа - представляется символом заключенном в апострофы. Символьные константы имеют тип int и при преобразовании типов дополняются знаком.  Некоторые неграфические символы, одиночная кавычка ' и обратная косая \, могут быть представлены в соответствие с таблицей  escape-последовательностей (табл.4). Управляющая последовательность рассматривается как одиночный символ, допустимо ее использовать в символьных константах. Значением символьной константы является числовой код символа.

    Примеры:

          ' '- пробел , 'Q'- буква Q , '\n' - символ новой строки ,

         '\\' - обратная дробная черта , '\v' - вертикальная табуляция . 

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

      Например:

             символ \h представляется символом h в строковой или символьной константе.

Строковая константа

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

    Например: “Школа N 35”, “город Тамбов”, “YZPT”.

Строковый литерал имеет тип char[] . Это означает, что строка рассматривается как массив символов. Отметим важную особенность, число элементов массива равно числу символов в строке плюс 1, так как нулевой символ (символ конца строки) также является элементом массива.  

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

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

 Например:

#include <stdio.h>

main()

{   char *p;

p = “Это пример того, как Turbo C++ “

“автоматически\nвыполняет для вас конкатенацию “

“очень длинных строк,\nчто позволяет получить “

“более красивые программы“;

printf(“%s”,p); }

На выходе программы будет:

Это пример того, как Turbo C++ автоматически

выполняет для вас конкатенацию очень длинных строк,

что позволяет получить более красивые программы.

Для расширения строковой константы за границы строки в качестве символа продолжения можно использовать обратную наклонную черту (\):

printf(“В действительности \

это однострочная строка символов”);

Отметим, что все управляющие символы, кавычка (“), обратная дробная черта (\) и символ новой строки в строковом литерале и в символьной константе представляются соответствующими управляющими последовательностями. Каждая управляющая последовательность представляется как один символ. Например, при печати литерала “Школа \n N 35” его часть “Школа” будет напечатана на одной строке, а вторая часть “N 35” на следующей строке.

Следует отметить, что в строковых константах всегда обязательно задавать все три цифры в управляющей последовательности (см.#2.1). Например, отдельную управляющую последовательность \n (переход на новую строку) можно представить как \010 или \xA, но в строковых константах необходимо задавать все три цифры, в противном случае символ или символы следующие за управляющей последовательностью будут рассматриваться как ее недостающая часть.

Например:

“ABCDE\x009FGH” данная строковая команда будет напечатана с использованием определенных функций языка С++, как два слова ABCDE FGH, разделенные 8-ю пробелами, в этом случае если указать неполную управляющую строку”ABCDE\x09FGH”,то на печати появится ABCDE=|=GH, так как компилятор воспримет последовательность \x09F как символ”=+=”.

printf(«\x0072.1Простая операционная система»);

Предполагается, что эта строка будет интерпретирована как \x007 и «2.1Простая операционная система». Однако, Turbo C++ (и TurboC версии 2.0) компилируют ее как шестнадцатеричное число \x0072 и литеральную строку «.1Простая операционная система».

Чтобы избежать этих проблем, надо переписать ваш код следующим образом:

printf(«\x007» «2.1Простая операционная система»);

Неоднозначность может возникнуть также и в случае, когда за восьмеричной управляющей последовательностью следует невосьмеричная цифра. Например, поскольку 8 и 9не являются допустимыми восьмеричными цифрами, константа \258 будет интерпретирована как двухсимвольная константа, составленная из символов \25 и 8.

2.2. Данные плавающего типа

Данные плавающего типа могут быть представлены:

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

Например:  27.3, 5.0, -16.003, 200.59

с плавающей точкой (они имеют вид: mEp - где m - мантисса; Е  -признак записи числа с десятичным порядком; р - порядок числа). В качестве m могут быть целые числа и действительные числа с фиксированной точкой (если целая часть мантиссы равна 0, то ее можно опустить, оставив только точку и дробную часть, стоящую после нее) . В качестве р могут быть только целые числа.  Как мантисса, так и порядок могут содержать знаки '+' или  '-' (знак '+' необязателен).

     Например: -7.64Е8, 9.1е-2, .967е+3.

Таблица 7 

ТипРазмер памяти в байтахДиапазон значенийНазвание типаFloat4от 3.4·10-38  до 3.4·1038  С плавающей точкой одинарной точностиdouble8от 1.7·10-308  до 1.7·10308   С плавающей точкой двойной точностиLong double10от 3.4·10-4932  до 1.1·104932  Длинный с плавающей точкой двойной точности

При отсутствии каких-либо суффиксов константы  плавающего типа по умолчанию имеют тип данных double. Однако,  можно присвоить константе с плавающей точкой тип данных float, добавив к ней суффикс f или F. Аналогичным образом, суффикс l или L присвоит константе тип данных long double. Это относится как к десятичным, так и к  восьмеричным или шестнадцатеричным константам. Эти константы называются явно заданными.

Внутреннее представление типов данных

                                               Направление возрастания значимости        

int                                              (дополнение до 2)

unsigned

int

long int                                                                   (дополнение до 2)

float

double

long

double

s – знаковый бит(0- положительный, 1- отрицательный)

| | - позиция неявной двоичной точки

1- целочисленный бит мантиссы:

записывается в long double

неявно (всегда 1) в float, double

Смещенный порядок (нормализованные значения):

float  - 127 (7FH)

double –1023 (3FFH)

long double – 16383 (3FFFH)

            

Алгоритм и программа

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

Алгоритм решения задачи может быть представлен в виде словесного описания или графически — в виде блок-схемы. При изображении алгоритма в виде блок-схемы используются специальные символы (рис. 1.1).

Рис. 1.1. Основные символы, используемые для

представления алгоритма в виде блок-схемы

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

Типы данных

Простые

Целые

Основные

char

long

int

short

unsigned char

Модифицированные

unsigned short

unsigned int

unsigned long 

Плавающие

loat

double

Long double

Сложные

Массивы

Структуры

Перечисления

Объединения

Указатели

Ссылки

Функции

Классы

void

s

значение

0

15

значение

15

0

0

s

значение

31

31

0

s

Смещенный порядок

мантисса

s

Смещенный порядок

мантисса

0

63

79

0

s

Смещенный порядок

мантисса

← Предыдущая
Страница 1
Следующая →

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

У нас самая большая информационная база в рунете, поэтому Вы всегда можете найти походите запросы

Искать ещё по теме...

Похожие материалы:

Стилистика и литературное редактирование

Методические указания для выполнения контрольных работ. Курс «Стилистика и литературное редактирование» является одним из базовых, общих профессиональных курсов.

Организация маркетинга

Организация маркетинга – процесс решения организационных вопросов осуществления маркетинговой деятельности. Характеристика процессов управления маркетингом. Этапы развития отделов маркетинга. Способы организации деятельности отделов маркетинга.

Последняя реформация

Дидактические системы. Структура процесса обучения

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

Бронирование туристских услуг в сети Интернет

Курсовая работа по дисциплине: Информационные технологии в менеджменте. Теоретические аспекты бронирования. Бронирование туров на сайте туроператора

Сохранить?

Пропустить...

Введите код

Ok