Основные характеристики алгоритмического языка Си 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные характеристики алгоритмического языка Си



Происхождение языка Си.

Сотрудник фирмы Bell Labs Деннис Ритчи создал язык Си в 1972 г. во время совместной работы с Кеном Томпсоном над операционной системой UNIX. Ритчи не выдумал Си просто из головы - прообразом послужил язык Би, разработанный Томпсоном. Отсюда и произошло его на первый взгляд, странное название. И здесь особенно важно то, что язык Си создавался как инструмент для программистов-практиков. В соответствии с этим главной целью его автора было создание удобного и полезного языка.

Очевидно, что критерий полезности принимался во внимание при разработке большинства других языков программирования. Но часто учитывались и другие потребности. Скажем одной из главных целей при создании языка Паскаль, было построение прочных основ обучения принципам программирования. А язык Бейсик создавался так, чтобы его синтаксис был близок к синтаксису английского языка. Такие цели легко объяснить: в то время вычислительная техника только начинала развиваться и было очень важно подключить к процессу ее развития как можно больше специалистов.

Основные характеристики алгоритмического языка Си

За 30 лет своего существования язык Си не только "выжил", но и послужил основой для целого ряда новых языков программирования. Я уж не говорю о непосредственных детях и внуках - языках С++ и С#. Значительное количество его элементов можно найти в других современных языках, таких как Java, PHP4 и ряде других.

Какие же характерные черты языка Си так выгодно отличают его от прочих языков?

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

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

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

Как итог вышесказанного - язык Си является языком создания практически эксплуатируемых программ. В качестве доказательства этого утверждения: большая часть операционных систем семейства UNIX сама написана на языке Си.

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

Область применения

Область применения языка Си практически не ограничена. Значительный объем эксплуатируемого программного обеспечения разработан на этом языке. И хотя в настоящее время он вытесняется еще более развитыми его потомками - С++, например, он не утратил своего значения. Можно сказать, что Си используется там, где требуется высокая эффективность исполняемого кода. В многих программных комплексах особо узкие места закрыты модулями, написанными на Си.

Системы программирования

Как уже было сказано, язык С был реализован на самых разных платформах. Что значит язык "реализован"? Это значит, что существует набор инструментов - система программирования, обеспечивающая фактическое выполнение описанных в программе действий.

Системы программирования основываются на одном из двух подходов реализации языка: интерпретации или компиляции.

Интерпретация предполагает последовательный анализ текста программы с ее одновременным исполнением. Т.е. разобрали какое действие в тексте программы записано - выполнили его, разобрали следующее действие - снова выполнили.

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

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

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

Обычно процесс преобразования текста программы в исполняемый код является многоэтапным (по крайней мере - двухэтапным).

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

Среда программирования

Здесь надо решить в какой среде работать?

Состав языка

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

 

- Алфавит языка, или его символы — это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

- Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.

- Выражение задает правило вычисления некоторого значения.

- Оператор задает законченное описание некоторого действия.

Алфавит языка

Алфавитом языка называется совокупность символов, используемых в языке.

В алфавит языка Си входят:

1 прописные и строчные буквы латинского алфавита (A,B,C,...,Z,a,b,c,...,z)

2 цифры (0,1,2,3,4,5,6,7,8,9)

3 специальные знаки " ' {} [] () | + - * / % \;.,:? < > _! & # ~ ^

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

Лексемы (CTokens)

Из символов алфавита формируются лексемы. В программах на языке Си базовые элементы, опознаваемые компилятором, называются лексемами (английский термин - "token).". В их состав входят:

- идентификаторы;

- ключевые (зарезервированные) слова;

- управляющие последовательности;

- знаки операций;

- константы;

- комментарии;

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

 

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

Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Список ключевых слов C++ приведен в табл. 1.1.

Таблица 1.1. Список ключевых слов C++

asm else new this
auto enum operator throw
bool explicit - private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpretcast typename
class for return union
const friend short unsigned
cohstcast goto signed using
continue if sizeof virtual
default inline static void
delete int staticcast volatile
do long struct wchart
double mutable switch while
dynamiccast namespace template    

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

Спецификаторы типов:

char символьный

double вещественный двойной точности

enum перечисляемый

float вещественный

int целый

long длинное целый

short короткое целое

struct структура

signed знаковый

union объединение

unsigned беззнаковый

void отсутствие значения

typedef синоним обозначения типа

Квалификаторы типа:

const квалификатор объекта, имеющего постоянное значение

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

Классы памяти:

auto автоматический

extern внешний

register регистровый

static статический

Элементы операторов:

break прервать

continue продолжить

do выполнять

for для

goto перейти

if если

return возврат

switch переключатель

while пока

Специальные идентификаторы:

default по умолчанию

case вариант

else иначе

sizeof размер

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

Управляющая последовательность Наименование Шестнадцатиричное значение
\a \b \t \n \v \f \r \” \’ \\ \ddd   \xddd Звонок Возврат на шаг Горизонтальная табуляция Новая строка Вертикальная табуляция Перевод формата Возврат каретки Кавычки Апостроф Обратная дробная черта Символ из набора кодов ПЭВМ в восьмиричном представлении Символ из набора кодов ПЭВМ в шестнадцатиричном представлении A B C D 5C     ddd

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

К знакам пунктуации относятся:

[ ] () { } *,: =;... #

Эти символы имеют в Си специальное назначение, которое мы будем раскрывать по мере изучения языка. Заметим здесь лишь, что знак (pound sign (#)) может использоваться только в директивах препроцессора языка Си.

Operators - знаки операций. В качестве знаков операции в языке Си могут выступать:

[ ] (). -> ++ -- & * + - ~! sizeof / % << >> < > <= >= ==!= ^ | && ||?: = *= /= %= += -= <<= >>= &= ^= |=, # ##

Идентификаторы

Идентификаторы - это имена, которые вы используете для переменных, типов, функций и меток вашей программы.

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

1. первым символом имени должна быть либо буква, либо символ подчеркивания

2. после первого символа можно использовать любую комбинацию букв и цифр, нельзя использовать не буквенно-цифровые символы вроде # или $

3. в С имеет значение регистр букв, имена Name и name будут представлять два различных идентификатора

4. в качестве идентификаторов нельзя использовать ключевые слова

Стандарт ANSI разрешает 6 значащих символов для имен внешних идентификаторов и 31 для внутренних. На внешние идентификаторы (объявленные как глобальные или внешние extern) могут налагаться дополнительные ограничения, поскольку они могут быть связаны с иным программным обеспечение, по своему определяющем это понятие.

Существует несколько альтернативных правил именования, но всегда важно то, что имя должно облегчать понимание читаемой программы. Это значит, что имя Square переменной, предназначенной для хранения вычисляемой площади, лучше, чем имя s. Можно давать имена вида AgeInYears, т.е. состоящие из сплошь записанных слов, каждое из которых начинается с прописной буквы. Другой подход - age_in_years - отделение слов символом подчеркивания.

Вопрос 2

Константы

Константами называют неизменяемые величины. Различаются целые, вещественные, символьные и строковые константы. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду1.

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

Таблица 1 Константы в языке C++

 

Константа формат Примеры  
Целая     Десятичный последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль 8, 0,199226  
Восьмеричный нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7) 01, 020, 07155    
Шестнадцатеричный Ох или ОХ, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) OxA, OxlB8, OXOOFF  
Вещественная   Десятичный цифрыцифры    
 
Экспоненциальный [цифры][][цифры]{Е;е}[+;-][цифры]3 0.2E6,.11e-3 5Е10  
Символьная   Один или два символа, заключенных в апострофы ‘А’,’ю', '\0', '\n', '\х07'  
Строковая   Последовательность символов, заключенная в кавычки "Здесь был Vasia"  

 

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

 

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char. Двухсимвольные константы занимают два байта и имеют тип int, при этом первый символ размещается в байте с меньшим адресом.

Здесь следует особо оговорить, что существует еще одна специальная константа - NULL. Эта константа задает "пустое" значение указателя - одного из элементов языка Си, который будет рассматриваться нами позже.

 

Комментарии

Комментарий либо начинается с двух символов «прямая косая черта» (//) и заканчивается символом перехода на новую строку, либо заключается между символами-скобками /* и */. Внутри комментария можно использовать любые допустимые на данном компьютере символы, а не только символы из алфавита языка C++, поскольку компилятор комментарии игнорирует.

 

Основные типы данных

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

- int (целый);

- char (символьный);

- wchar_t (расширенный символьный);

- bool (логический);

- float (вещественный);

- double (вещественный с двойной точностью).

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

целых величин, отличается от кода для величин с плавающей точкой.

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

- short (короткий);

- long (длинный);

- signed (знаковый);

- unsigned (беззнаковый).

Тип .. Диапазон значений Размер (байт)
Bool true и false  
signed char -128...127  
unsigned char 0...255  
signed short int -32 768... 32 767  
unsigned short int 0... 65 535  
signed long int -2 147 483 648... 2 147 483 647  
unsigned long int 0... 4 294 967 295  
Float 3.4е-38... 3.4е+38  
Double 1.7е-308... 1.7е+308  
long double 3.4е-4932... З.4е+4932  

Целый тип (int)

Размер типа int не определяется стандартом, а зависит от компьютера и компилятора. Для 16-разрядного процессора под величины этого типа отводится 2 байта, для 32-разрядного — 4 байта.,

Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта независимо от разрядности процессора. Спецификатор long означает, что целая величина будет занимать 4 байта. Таким образом, на 16-разрядном компьютере эквиваленты 1nt и short 1nt, а на 32-разрядном — int и long int.

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

 

Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.

Символьный тип (char)

Под величину символьного типа отводится количество байт, достаточное для размещения любого символа из набора символов для данного компьютера, что и обусловило название типа. Как правило, это 1 байт. Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от -128 до 127. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Этого достаточно для хранения любого символа из 256-символьного набора ASCII. Величины типа char применяются также для хранения целых чисел, не превышающих границы указанных диапазонов.

Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.

Типы данных с плавающей точкой хранятся в памяти компьютера иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка. В IBM PC-совместимых компьютерах величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка — его диапазон. Как можно видеть из таблицы, при одинаковом количестве байтов, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления.

Спецификатор long перед именем типа double указывает, что под величину отводится 10 байтов.

Константы с плавающей точкой имеют по умолчанию тип double

Тип void

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

Инициализация переменных

В соответствии с синтаксисом языка С, после определения в программе переменные по умолчанию имеют неопределенные значения. Надеяться на то, что они равны, например, 0, нельзя. Однако переменным можно присваивать начальные значения, явно указывая их в определениях:

<тип> <имя переменной>=<начальное значение>;

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

float pi=3.1415, coef=2.45;

unsigned int year=2006;

char plus='+';

 

Структура программы

Программа на языке C++ состоит из функций, описаний и директив препроцессора (с. 16). Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции.

Структура простейшей программы имеет вид:

1) Директивы компилятора

# include <имя подключаемого файла>

2) Главная функция программы

void main(void)

{

 

}

3) внутри функции main

- объявление использованных переменных тип имя переменной

- ввод исходной информации

- обработка данных

- вывод результата

Ввод/вывод информации

 

Основные функции форматированного ввода/вывода

int scanf (const char* format....) // ввод

int printf(const char* format....) // вывод

Для их использования необходимо подключить библиотеку <stdio.h>

# include <stdio.h>

 

Синтаксис функции printf

printf(«Управляющая строка», список параметров)

Функция printf возвращает число напечатанных символов

Список параметров перечисляется через запятую.

Управляющая строка состоит из:

- обычные символы, которые выводятся на экран

- управляющие символы

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

%[флаг][ширина поля][. точность ][h/l/L]тип

Тип может принимать одно из следующих значений

 

Код Формат
c d или i u o x (X) f е илиЕ g или G s p %   Символ Знаковое десятичное целое число Беззнаковое десятичное число Беззнаковое восьмиричное число Беззнаковое шестнадцатиричное число (х-строчные буквы,Х-прописные буквы) Значение с плавающей запятой в форме –цел.часть. дроб.часть Значение с плавающей запятой в форме –цел.часть. дроб.частье степень То же что и %е только не выводятся последние нули Строка символов Вывод указателя Выводит знак %

Флаг:

- Выведенное значение прижимается к левому краю(по умочанию вправо) %-20s
+ Перед числом обязательно выводитяс знак + или- %+d
Пробел Если выводится неотрц. число, то перед ним ставится пробел % 6.2f
  заполнение пустых позиций нулями %010d, %08.3f
# Вывод первого 0 для восьмеричных, 0x или 0X для 16-ых. Для всех форм с плавающей точкой гарантируется вывод символа десятичной точки. Для форм %g %G предотвращает удаление заключительных нулей. %#o, %#8.0f, %+#10.3E

 

Модификатор формата ширина представляется целым положительным числом и служит для указания минимального количества выводимых символов. Если количество символов выводимого значения меньше width, поле будет дополняться символами в соответствии с указанными флагами. Заметим, что значение width никогда не ограничивает выводимое значение.

Модификатор формата.точность используется для чисел с плавающей точкой. Точность представляется неотрицательным целым числом, следующим за точкой и задает либо количество символов, которое должно быть выведено, либо количество цифр в дробной части числа, либо количество значащих цифр. Так "%5.2f" определяет вывод вещественного числа в поле шириной пять символов с двумя цифрами после десятичной точки.

Модификаторы, представленные в описании строки формата перечнем {h | l | L}, используются для спецификации размера аргумента:

h short int(d, i, o, x, X) и short unsigned int (u)

l long int(d, i, o, x, X) и long unsigned int (u)

L long double (e,E,f,g,G)

Функция форматированного ввода информации scanf.

В целом функция вода scanf очень подобна на функцию printf. Она также использует строку, задающую необходимые форматные преобразования. Главное различие этих функций заключается в списке параметров. Функция printf использует имена переменных, константы и выражения. Функция scanf в качестве параметров использует только указатели на переменные, т.е. адреса заполняемых переменных. Подробно мы будем изучать указатели позднее, а пока постараемся воспользоваться функцией scanf на основании двух следующих простых правил:

- если вы хотите ввести значение для одного из основных типов переменной, перед именем переменной ставьте символ &;

- если читается строка в символьный массив, знак & не ставится.

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

Спецификаторы формата для функции scanf представляются следующей таблицей

 

type Результат - Интерпретирует ввод как
%c символ
%d десятичное целое число со знаком
%e, %f, %g число с плавающей точкой
%E,%G число с плавающей точкой
%i десятичное целое число со знаком
%o восьмеричное целое число без знака
%p указатель (адрес памяти)
%s строку; ввод начинается с 1-го не служебного символа и включает все символы до следующего служебного
%u десятичное целое число без знака
%x, %X шестнадцатеричное целое число без знака

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

Модификатор Значение
* Подавление присваивания - пропуск принимаемого значения
Цифры Максимальная ширина поля; ввод закончиться либо при обнаружении первого служебного символа, либо когда достигнута максимальная ширина поля
h, l, L %hd и %hi указывают, что значение поступает в тип short. %ho, %hx и %hu - в тип unsigned short. %ld и %li - в тип long. %lo, %lx и %lu - в тип unsigned long. %le, %lf и %lg в тип double. Использование L вместо l - long double. Отсутствие предполагает: d, i, o, x - в тип int, e, f, g - в тип float

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

scanf("%d, %d", &n, &m);

При вводе следует набирать например, 567,212.

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

567,212 567, 212 567, 212

Функция возвращает число успешно прочитанных элементов. Если она не прочла никаких элементов - возвращается значение 0. Она возвращает EOF ("End of file") - специальную константу, значение которой определено в заголовочном файле stdio.h, в случае, когда поток заканчивается раньше, чем определены все специфицированные в вызове функции переменные.

А вот как выглядит та же программа с использованием библиотеки классов C++

#include <iostream.h>

int main()

{

int i;

cout << "Введите целое число\n”;

cin>> i;

cout <<"Вы ввели число " << i<< " \nспасибо!";

return 0; }

Заголовочный файл <iostream h> содержит описание набора классов для управления вводом/выводом В нем определены стандартные объекты-потоки cm для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток <<и чтения из потока >>.

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

Тема 2. Язык программирования С/С++. Выражения и операции

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

(4 х 5) - 4 представляет значение 16.

Почленная интерпретация этого выражения - "взять число 4, умножить его на 5, из результата вычесть 4".

В языке С существует три типа выражений:

- математическое выражение, дающее численный результат;

- текстовое выражение, дающее строку символов;

- логическое выражение, дающее в результате 1 или 0 (интерпретируемые как "истина" или "ложь".

В зависимости от типа выражения в языке С используются те или иные операции.

Арность операции - это количество задействованных в операции операндов. Например

2 + 3 - бинарная (двуместная) операция, -4 - унарная (одноместная) операция.

Унарные операции

& операция получения адреса операнда

&c_Symb - адрес размещения в памяти значения переменной c_Symb.

* операция обращения по адресу (называют еще операцией разыменования (доступ по адресу к значению того объекта, на который указывает операнд).

- унарный минус (изменяет знак арифметического операнда).

+ унарный плюс (введен для симметрии с унарным минусом).

~ побитовое отрицание 0001 1100 à 1110 0011

! логическое отрицание 0 à 1, не 0 à 0.

++ увеличение на единицу (инкремент или автоувеличение), существует две формы:

префиксная - увеличение до использования

...

int result, arg=2;

result = ++arg;

после выполнения result примет значение 3.

постфиксная - увеличение после использования

...

int result, arg=2;

result = arg++;

после выполнения result примет значение 2.

-- уменьшение на единицу (декремент или автоуменьшение), также префиксная и постфиксная формы.

sizeof операция вычисления размера операнда (в байтах)

sizeof(char) = 1

sizeof(long) = 4

short Count; --- sizeof(Count) = 2

Бинарные операции

Делятся на следующие группы:

1 аддитивные и мультипликативные

2 сдвигов

3 поразрядные

4 операции отношений

5 логические

6 выбора компонента сложного объекта

7 операция "запятая"

8 скобки в качестве операций

Аддитивные и мультипликативные.

+ бинарный плюс - сложение арифметических операндов или сложение указателя с целым
- бинарный минус - вычитание арифметических операндов или вычитание указателей
* умножение операндов арифметического типа
/ деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого. 20/3 = 6 и (-20)/3 = -6
% получение остатка от деления целочисленных операндов (деление по модулю). Знак остатка равен знаку делимого. Например: 14%3 = 2 и (-14)%3 = -2

Один нюанс, который вы должны запомнить.

float res;

res = 5/4;

Результат: res = 1.

Для того, чтобы посчитать "правильно", этот фрагмент программы должен быть

float res;

res = 5./4.;

Результат: res = 1.25.

Операции сдвига. Эти операции определены только для целочисленных операндов.

<< сдвиг влево битового представления левого операнда на число позиций равное значению правого операнда.

short res, Value = 12;

res = Value << 5;

12=0000 0000 0000 1100 - после операции 0000 0001 1000 0000 =0x180=256+128 = 384

12 * 25 = 12 * 32 = 384

>> сдвиг вправо битового представления левого операнда на число позиций равное значению правого операнда.

short res, Value = 1120;

res = Value >> 5;

1120 = 1024 + 96 = 1024 + 64 + 32 = 210 + 26 + 25 = 0000 0100 0110 0000

- после операции 0000 0000 0010 0011 =0x23=32+3 = 35

1120 / 25 = 1120 / 32 = 35

Поразрядные операции.

Выполняются над битовыми представлениями значений целочисленных операндов

& поразрядная конъюнкция (И)
| поразрядная дизъюнкция (ИЛИ)
^ поразрядное исключающее ИЛИ

Операция конъюнкция 0&0 = 0 1&0 = 0 0&1 = 0 1&1 = 1

Операция дизъюнкция 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 1

Операция поразрядное исключающее ИЛИ 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 0

Пример.

0000 0001 1100 1110

0110 0111 0110 1010

--------------------------

0000 0001 0100 1010 (&)

0110 0111 1110 1110 (|)

0110 0110 1010 0100 (^)

Операции отношений (сравнения).

< меньше, чем
> больше, чем
<= меньше или равно, чем
>= больше или равно, чем
== Равно
!= не равно

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

Результат операции целочисленный: 0 (ложь) или 1 (истина).

Логические операции.

&& конъюнкция (И) арифметических операндов или отношений

|| дизъюнкция (ИЛИ) арифметических операндов или отношений

Результат 0 (ложь) или 1 (истина).

Примеры отношений и логических операций:

4 < 9 → 1

3 == 5 → 0

3!= 5 || 3==5 → 1

(3+4>5) && (3+5>4) && (4+5>3) → 1

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

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

Существует одна простая операция присваивания и ряд составных.

Простое присваивание -

А = B*2; - присвоить переменной А результат вычисления выражения B*2.

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

X = XÅY; - тоже в записи составного присваивания X Å=Y;

В качестве символа Å могут быть использованы знаки операций: + - * / % << >> & | ^

Примеры. f += 5; d -=f*2; con ^=0xff71;

Операции выбора компонентов структурированного объекта.

Существует две операции (. и ->) которые мы будем рассматривать позже, вместе с определением самих структурированных объектов.

Запятая в качестве операции.

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

int x,y; y = (x=3, 3*x); (после операции х=3, y=9).

Скобки в качестве операций.

Круглые и квадратные скобки играют роль бинарных операций при вызове функций и индексировании элементов массивов.

Круглые скобки обязательны в обращении к функции:

<имя функции> (<список аргументов>)

где операндами служат <имя функции> и <список аргументов>.

Квадратные скобки используются в выражении

<имя массива> [<индекс>]

здесь операнды <имя массива> и <индекс>

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

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

Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора i f (он рассмотрен на с. 40).

#include <stdio h>

int main(){

int a = 11, b = 4, max;

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

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

return 0; }

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

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

Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает п, а иначе принимала значение 1:

i = (i < n)? i + 1: 1,

Приоритет операций. Порядок вычисления выражений.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 873; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.152.162 (0.216 с.)