Оператор в программировании
Оператор в программировании — это команда, обозначающая определенное математическое или логическое действие, выполняемое с данными (операндами). Является минимальным автономным элементом компьютерной программы. По сути любая компьютерная программа представляет собой последовательность операторов. Близким аналогом операторов в естественных языках являются фразы или предложения, из которых состоит текст.
«IT-специалист с нуля» наш лучший курс для старта в IT
Каждый оператор имеет свое написание (синтаксис) и семантику (содержание, смысл). В зависимости от конкретного языка синтаксис оператора может существенно различаться, хотя в целом для обозначения той или иной операции используются символы, имеющие аналогичное или похожее значение в математике или формальной логике.
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам
Зачем нужны операторы в программировании?
Компьютерная программа представляет собой алгоритм, то есть последовательность определенных действий с данными. Ее создает человек, но исполняет компьютер, поэтому она должна быть понятна им обоим. Поэтому просто описать определенную операцию, скажем, присваивания значения переменной обычным (естественным) языком, хоть и теоретически возможно, на практике очень неудобно. Для человека такой код будет очень громоздким и сложно воспринимаемым настолько, что написание сколько-нибудь большой программы станет невозможным. А чтобы код воспринимался компьютером, придется разработать сложный компилятор для его перевода на машинный язык.
Поэтому для обозначения операций в программировании были взяты символы, используемые в аналогичных языках в математических выражениях и формальной логике. Именно они стали основой для синтаксиса операторов в абсолютном большинстве современных ЯП. Таким образом, операторы в программировании выполняют следующие функции:
- упрощают и сокращают код, делают его более понятным человеческому восприятию;
- обозначают определенную операцию с данными таким образом, чтобы ее можно было легко перевести на машинный код.
Среди дополнительных преимуществ использования операторов можно выделить простое восприятие программы человеком независимо от того, носителем какого естественного языка он является. Это достигается за счет универсальности математических и логических символов.
Общее свойство операторов
Все операторы в программировании имеют одно общее свойство — они исполняются. То есть по своей сути они являются инструкциями, которым должен следовать компьютер, чтобы определенным образом обработать данные и выполнить программу. При этом сам оператор является чистой математической или логической абстракцией, под ним не подразумевается каких-либо конкретных объектов вроде ячеек памяти. На протяжении всего исполнения программы он остается в неизменном виде — зато изменяются данные, содержащиеся в памяти компьютера. Иными словами, эти изменения информации и являются исполнением команды, обозначенной оператором.
Виды операторов в программировании
В различных языках программирования имеются свои системы операторов и операций. Но в целом их можно классифицировать, разделив на несколько основных типов.
Оператор присваивания. Он используется в том случае, когда необходимо присвоить определенное значение переменной. То есть показать программе, что в данной ячейке памяти, обозначенной именем, лежат конкретные данные, которые нужно будет использовать в процессе исполнения кода. В большинстве языков программирования алгоритм присваивания использует знак равенства. Например, на языке Python данная операция выглядит следующим образом:
х = 365, где х — это имя переменной, 365 — ее значение, а «=» — знак присваивания.
Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Арифметические операторы. Это группа операторов, обозначающих математические действия с данными. В большинстве языков программирования они обозначаются символами, использующимися в том же значении в обычных арифметических управлениях, хотя некоторые из них могут иметь собственное обозначение — например:
- «-» — вычитание;
- «+» — сложение;
- «*» — умножение;
- «/» — деление без остатка;
- «—» — уменьшение;
- «++» — увеличение.
Два последних оператора из этого списка используются в языке С и обозначают уменьшение или увеличение операнды на 1. В других ЯП эта операция записывается, например, следующим образом: х = х + 1 или х = х – 1.
Логические операторы. Они помогают установить отношения между различными данными и/или обозначить условия, при которых будут выполняться какие-либо действия. Ключевой концепцией для их понимания является соотношение «правда/ложь» (true/false). Логические операторы по своей семантике и синтаксису базируются на формальной логике. В различных языках программирования их обозначение бывает разным, причем не только символьным, но и буквенным — например:
- Оператор «И» сравнивает несколько значений друг с другом и выдает результат «истина/ложь», от которого зависит дальнейшее выполнение программы. Результат «истина» возможен только в том случае, когда все значения истинны. Обозначается словом «and» или знаками &, &&.
- Оператор «ИЛИ» также сравнивает несколько значений друг с другом. Отличается от предыдущего тем, что выдает результат «ложь» только в том случае, когда все сравниваемые значения ложные. Обозначается словом «or», знаком ||.
- Оператор «НЕ» предназначен для замены значения на противоположное, то есть «истина» на «ложь» и наоборот. В программировании обозначается восклицательным знаком «!».
Операторы сравнения. Они часто используются в связке с логическими операторами для сравнения различных значений друг с другом, результатом чего является результат «истина/ложь». Например, в языке С они обозначаются следующими символами:
- «>» — больше;
- «<» — меньше;
- «>=» — больше или равно;
- «<=» — меньше или равно;
- «==» — равно;
- «!=» — не равно.
Помимо этих основных операторов в программировании используются и другие, причем в зависимости от языка их набор может существенно различаться, что влияет на возможности ЯП и гибкость написанного на нем кода. Часто в одном и том же языке сосуществуют операторы, обозначаемые словом или символом. Например, в языке Pascal наряду с символьным оператором присваивания «:=» присутствует оператор безусловного перехода «goto», записанный буквами латинского алфавита.
Все указанные выше команды являются простыми, то есть обозначающими одну конкретную операцию с данными. Помимо них в программировании используются составные операторы, то есть состоящие из нескольких простых. Соответственно, они имеют специальные обозначения для корректного написания в программе:
- Границы составного оператора могут обозначаться в различных языках фигурными скобками (в С или С++), словами «begin» и «end».
- Разделителем, отделяющим друг от друга простые операторы, входящие в состав сложного.
Составные операторы впервые появились в языке Алгол, из которого были унаследованы многими другими ЯП, такими как Pascal, C, C++ и т. д. Они позволяют использовать несколько операторов там, где ожидается применение одного — например, в операциях ветвления. Составные операторы позволяют упростить программный код и упорядочить его исполнение. Пример написания составного условного оператора «switch» (заменяющего множество простых операторов «if» на языке С:
switch(ii)
<
case 1: Buf_1[Pok-f+i]= Prognoz; break;
case 2: Buf_2[Pok-f+i]= Prognoz; break;
case 3: Buf_3[Pok-f+i]= Prognoz; break;
>
По своему назначению в структуре программы операторы можно разделить на следующие основные типы:
Операторы выбора. Они используются в тех случаях, когда программа подразумевает выбор из некоторого числа значений, в зависимости от которых происходит ее дальнейшее исполнение или неисполнение. Иными словами, они обозначают ветвление алгоритма. Типичным примером является оператор «if» в языке С, который разделяет программу на два сценария в зависимости от того, исполняется или нет указанное в нем условие.
Операторы цикла. С помощью таких операторов в программе обозначаются операции, выполняемые многократно (циклы). Они тоже содержат условия или параметры, при соблюдении которых цикл повторяется. В языке Pascal таким оператором является «while». Например, конструкция «while B do S» в переводе на естественный язык означает, что пока значение логического выражения (условия) B истинно, программа будет исполнять цикл S до тех пор пока B не станет ложным. В зависимости от того, как используется условие, операторы цикла можно разделить на 3 группы:
- с предусловием — то есть условием, соблюдение которого необходимо для осуществления цикла;
- В операторе с постусловием ситуация обратная — при выполнении условия цикл завершится;
- В операторе с параметром (переменной) вводится изменяемое значение, которое определяет конечное количество повторений цикла.
Операторы вызова процедуры. Под процедурами в программировании подразумевается подпрограмма (функциональный блок, входящий в основную программу). Фактически оператор вызова процедуры инициирует ее начало и определяет завершение по достижении нужных результатов. Таким образом, он позволяет сделать программу более понятной, а ее исполнение — последовательным и безошибочным.
Операторы перехода. Они перенаправляют исполнение программы к определенному фрагменту кода, помеченному специальной меткой. Операторы перехода позволяют создавать работающие алгоритмы со сложной структурой. Типичным примером такого оператора в языке Pascal является безусловный оператор «goto». Помимо него есть также оператор прерывания цикла «break» или досрочного завершения его текущей операции «continue», прерывания всей программы «exit» и т. д. Подобные операторы присутствуют и в других языках программирования, таких как С, С++, Java и т. д.
Порядок исполнения операторов
Для правильного использования операторов в программировании важно правильно задать последовательность их исполнения. Стандартным является вариант, когда простые и сложные операторы исполняются последовательно сверху вниз (если они расположены на разных строках) и справа налево (в одной строке). Так они и должны быть отражены в коде программы. Простые операторы, входящие в состав сложного (множественного), исполняются по тому же принципу. Однако такой принцип последовательности не единственный: в некоторых языках программирования есть возможность настроить его более гибко. Это зачастую ведет к усложнению структуры программы.
Таким образом, операторы в программировании являются одной из важнейших составляющих кода, минимальной функциональной единицей, без которой невозможно исполнение даже самой простой программы. Для их эффективного применения необходимо четко соблюдать правила синтаксиса, предусмотренные в конкретном языке, понимать смысл выполняемых операций и правильно задавать последовательность их исполнения.
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Язык C: операторы
Оператор — это символ, который дает команду компилятору выполнить определенные математические или логические функции. В распоряжении пользователей языка С множество встроенных операторов различных типов:
- Арифметические операторы.
- Операторы сравнения.
- Логические операторы.
- Побитовые операторы.
- Операторы присваивания.
- Другие операторы.
Рассмотрим принцип работы каждого типа операторов.
Арифметические операторы
Предположим, что переменная A содержит значение 10, а переменная B содержит значение 20.
- Сложение (+) складывает два операнда: A + B = 30.
- Вычитание (—) вычитает второй операнд из первого: A — B = -10.
- Умножение (*) перемножает оба операнда: A * B = 200.
- Деление (/) делит числитель на знаменатель: B / A = 2.
- Модуль (%) определяет остаток после деления целых чисел: B % A = 0.
- Инкремент (++) увеличивает целочисленное значение на единицу: A++ = 11.
- Декремент ( — ), уменьшающий целочисленное значение на единицу: A — = 9.
Примеры написания кода с арифметическими операторами
Операторы сравнения
Предположим, что переменная A содержит значение 10, а переменная B содержит значение 20.
- Равенство (==) проверяет, равны или нет значения двух операндов. Если да, то условие становится истинным: (A == B) не является истинным.
- Неравенство (!=) проверяет, равны или нет значения двух операндов. Если значения не равны, то условие становится истинным: (A != B) — истинно.
- Больше (>) проверяет, больше ли значение левого операнда, чем значение правого операнда. Если да, то условие становится истинным: (A > B) не является истинным.
- Меньше (<) проверяет, меньше ли значение левого операнда, чем значение правого операнда. Если да, то условие становится истинным: (A < B) — истинно.
- Больше или равно (>=) проверяет, действительно ли значение левого операнда больше или равно значению правого операнда. Если да, то условие становится истинным: (A >= B) не является истинным.
- Меньше или равно (<=) проверяет, действительно ли значение левого операнда меньше или равно значению правого операнда. Если да, то условие становится истинным: (A <= B) — истинно.
Примеры написания кода с операторами сравнения
Логические операторы
Предположим, что переменная A равна 1, а переменная B равна 0.
- Логический операторAND (&&). Если оба операнда ненулевые, то условие становится истинным: (A && B) — ложно.
- Логический операторOR (||). Если любой из двух операндов ненулевой, то условие становится истинным: (A || B) — истинно.
- Логический операторNOT(!). Используется для преобразования в обратное логическое состояние своего операнда. Если условие истинно, то оператор NOT сделает его ложным: !(A && B) — истинно.
Примеры написания кода с логическими операторами
Побитовые операторы
Побитовый оператор работает с битами и выполняет побитовую операцию. Таблицы истинности для &, | и ^ выглядят следующим образом:
Если предположить, что A = 60 и B = 13 в бинарном формате, то они будут выглядеть следующим образом:
Ниже перечислены побитовые операторы, поддерживаемые C. Предположим, что переменная ‘A’ содержит значение 60, а переменная ‘B’ — значение 13.
- Побитовый оператор AND (&) копирует бит в результат, если он есть в обоих операндах: (A & B) = 12, т. е. 0000 1100.
- Побитовый оператор OR (|) копирует бит, если он есть в любом из операндов: (A | B) = 61, т. е. 0011 1101.
- Побитовый оператор XOR (^) копирует бит, если он установлен в одном операнде, но не в обоих: (A ^ B) = 49, т. е. 0011 0001.
- Оператор дополнения бинарной единицы (
), являясь унарным, обладает эффектом инвертирования битов: (
Примеры написания кода с бинарными операторами
Операторы присваивания
- Простой оператор присваивания (=) присваивает значения правых операндов левому операнду: C = A + B с присвоением A + B операнду C.
- Add AND (+=) добавляет правый операнд к левому операнду и присваивает результат левому операнду: C += A эквивалентно C = C + A.
- Subtract AND (-=) вычитает правый операнд из левого операнда и присваивает результат левому операнду: C -= A эквивалентно C = C-A.
- Multiply AND (*=) перемножает правый операнд с левым операндом и присваивает результат левому операнду: C *= A эквивалентен C = C * A.
- Divide AND (/=) делит левый операнд на правый операнд и присваивает результат левому операнду: C /= A эквивалентен C = C / A
- Modulus AND (%=) вычисляет остаток от деления двух операндов и присваивает результат левому операнду: C %= A эквивалентно C = C % A.
- Left shift AND (<<=) — побитовый сдвиг влево, совмещенный с операцией присваивания: C <<= 2 эквивалентно C = C << 2.
- Right shift AND (>>=) — побитовый сдвиг вправо, совмещенный с операцией присваивания: C >>= 2 эквивалентно C = C >> 2.
- Bitwise AND (&=) — побитовое “И”, совмещенное с операцией присваивания: C &= 2 то же самое, что C = C & 2.
- Bitwise XOR (^=) — побитовое “исключающее ИЛИ”, совмещенное с операцией присваивания: C ^= 2 то же самое, что C = C ^ 2.
- Bitwise OR (|=) — побитовое “ИЛИ”, совмещенное с операцией присваивания: C |= 2 то же самое, что C = C | 2.
Примеры написания кода с операторами присваивания
Другие операторы
Помимо рассмотренных выше в языке C есть еще несколько важных операторов:
- Оператор размера sizeof() возвращает размер переменной, например: sizeof(a), где a — целое число, возвращает 4.
- Оператор ссылки (&) возвращает фактический адрес переменной, например: &a.
- Оператор непрямого обращения (*) обращает к объекту, на который указывает переменная, например: *a;
- Тернарный условный оператор (? 🙂 выполняет тернарную условную операцию: если условие ? истинно, тогда значение X : иначе значение Y.
Примеры написания кода с операторами sizeof(), &, *, ?
Старшинство операторов
Старшинство операторов определяет группирование членов в выражении и решает, как будет оцениваться выражение. Некоторые операторы имеют более высокий уровень старшинства, чем другие. Так, оператор умножения имеет более высокий приоритет, чем оператор сложения.
Рассмотрим конкретный пример: x = 7 + 3 * 2. Здесь x присваивается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому сначала выполняется умножение 3*2, а затем результат складывается с 7. Таким образом, операторы с более высоким старшинством должны оцениваться первыми.
В приведенном ниже списке операторы с наибольшим старшинством находятся в самом верху, а с наименьшим — внизу. В скобках указана ассоциативность операторов.
Что означает знак в программировании
Для использования в программах С определено два набора символов: «набор символов С» и «представительный набор символов».
Набор символов С состоит из букв, цифр и символов пунктуации, которые в С имеют специальное значение. Вы строите программу в С, комбинируя символы набора символов С в осмысленные операторы.
Набор символов С является подмножеством представительного набора символов, Представительный набор символов содержит все буквы, цифры и символы, которые имеют графическое представление в виде одного символа. Содержание представительного набора зависит от типа используемого терминала, консоли или символьного устройства.
Все символы программы на С должны быть из набора символов С. Однако, строковые литералы, символьные константы, комментарии и имена файлов в директиве #include могут содержать любой символ из представительного набора.
Каждый символ в наборе символов С имеет в языке конкретное значение, поэтому компилятор выводит сообщение об ошибке при обнаружении несоответствия в использовании символа в программе.
Следующий раздел рассматривает символы из набора символов С и объясняет, как и когда ими пользоваться.
Буквы, цифра и подчеркивание
Прописные английские буквы:
Компилятор С обрабатывает прописные и строчные буквы, как разные символы. Например, если в идентификаторе использована строчная буква a, Вы не можете заменить ее на прописную букву A, а должны использовать строчную букву.
Разделительные символы
Пробел, смена строки, возврат каретки и символ новой строки называются разделительными символами, т.к. они выполняют функцию пробелов между словами и строками в напечатанной странице. Эти символы отделяют задаваемые пользователем элементы (например, константы и идентификаторы, от других элементов программы.
Компилятор С игнорирует разделительные символы, если они не служат для целей разделения или не являются компонентами символьных констант или строковых литералов. Таким образом, можно использовать дополнительные разделительные символы для улучшения восприятия программы. Компилятор рассматривает комментарии, как разделительные символы. (Комментарии рассматриваются в разделе «Комментарии».)
Знаки пунктуации и специальные символы
Знаки пунктуации и специальные символы из набора символов С имеют самое разное предназначение, от организации текста программы до определения задач, которые будут выполнены компилятором или скомпилированной программой. В Таблице 2.1 приведен список знаков пунктуации и специальных символов из набора символов С.
Таблица 2.1. Знаки пунктуации и специальные символы
Управляющие последовательности
Строки и символьные константы могут содержать «управляющие последовательности». Управляющие последовательности это комбинации символов, состоящие из разделительного символа и неграфических символов. Управляющая последовательность состоит из знака обратного деления (\) за которым следует буква или комбинация цифр.
Управляющие последовательности обычно используются для задания каких-либо действий (например, возврат каретки или сдвиг на табуляцию на экране или на принтере) или для литерального представления неграфических символов и символов, имеющих специальное значение (например, двойные цитатные скобки — «). Таблица 2.2 содержит список управляющих последовательностей.
Последовательность \ddd позволяет задавать любой символ ASCII (Стандартный Код США по Обмену Информацией), указывая его восьмеричный код из трех цифр. Аналогично, последовательность \xddd позволяет задавать любой символ ASCII, указывая его шестнадцатеричный код из трех цифр. Например, пробел можно указать как \b, \010 (восьмеричное значение) или \x008 (шестнадцатеричное значение).
В восьмеричных управляющих последовательностях можно использовать только цифры от 0 до 7. Хотя и не нужно использовать все три цифры (как это показано в предыдущем абзаце), нужно указать хотя бы одну. Например, можно задать символ забоя ASCII в восьмеричном представлении, как \10. Аналогично, можно использовать по крайней мере одну цифру в шестнадцатеричной управляющей последовательности, и опустить вторую и третью цифру. Более того, можно задать пробел в шестнадцатеричном представлении, как \x08 или \x8.
При использовании в строках восьмеричного или шестнадцатеричного представления управляющих последовательностей более безопасно задавать все три цифры. Если не задать все три цифры в управляющей последовательности, а за ней непосредственно следует восьмеричное или шестнадцатеричное число, то компилятор интерпретирует этот символ, как часть управляющей последовательности. Например, если напечатать строку «\x07Bell», то результатом будет Управляющие последовательности позволяют посылать на экран неграфические управляющие символы. Например, управляющий символ \033 часто используется в качестве первого символа в команде управления терминалом или принтером. Некоторые управляющие последовательности зависят от устройств. Например, вертикальная табуляция и смена листа (\v и \f) никак не скажутся при выводе на экран, но произведут указанное действие на принтере. В программах на С следует всегда представлять неграфические символы в виде управляющих последовательностей, т.к. их непосредственное использование может вызвать появление диагностических сообщений компилятора. Символ обратного деления можно также использовать в качестве символа продолжения. Если символ новой строки непосредственно следует за знаком обратного деления, то компилятор игнорирует знак обратного деления и символ новой строки и рассматривает следующую строку текста, как часть предыдущей. Это особенно удобно для задания определений предпроцессора, которые могут занимать более одной строки. В прошлом эта особенность использовалась для создания строковых объектов, которые занимали более одной строки текста. Однако, теперь более предпочтительно использовать конкатенацию строк (см.»Строковые литералы») для создания длинных строковых литералов. «Операторы» это символы (состоящие из одного символа или комбинации символов), которые задают манипуляции над значениями. Каждый символ интерпретируется как отдельный элемент, называемый «лексемой». (Определение лексем содержится в разделе «Лексемы».) В Таблице 2.3 содержится список унарных операторов С с их именами. В Таблице 2.4 содержится список бинарных и тернарных операторов С с их именами. Операторы нужно задавать так, как они показаны в таблицах, без разделительных знаков в многосимвольных операторах. Обратите внимание на то, что три символа операторов (звездочка, знак минуса и амперсанд) появляются в двух таблицах. Их унарная или бинарная интерпретация зависит от контекста, в котором они появляются. Оператор sizeof не включен в эти таблицы. Это скорее ключевое слово (sizeof), чем символ, и поэтому приводится в разделе «Ключевые слова». Таблица 2.3. «Унарные операторы» Таблица 2.4. «Бинарные и тернарные операторы» Оператор условия является тернарным, а не многосимвольным оператором. Условное выражение имеет вид: выражение?выражение:выражение. Полное описание каждого оператора содержится в главе «Выражения и присвоения». Константа это число, символ или строка символов, которая в программе используется, как значение. Значение константы нельзя изменить. В языке С есть четыре вида констант: целые, с плавающей точкой, символьные и строковые литералы.Операторы
Целые константы
В Таблице 2.5 приведены примеры трех форм целых констант.
Целые константы всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. (В данном случае знак минус интерпретируется как унарный арифметический оператор отрицания.)
- Десятичные константы рассматриваются как величины со знаками и имеют тип int или long, если этого требует величина значения.
- Восьмеричные и шестнадцатеричные константы в зависимости от размера имеют тип int, unsigned int, long или unsigned long. Если константа может быть представлена, как int, то ей присваивается тип int. Если она больше, чем может хранится в int, но она может быть представлена тем же числом бит, что и int, то ей присваивается тип unsigned int. Аналогично, если константа не размещается в unsigned int, то ей присваивается тип long, или unsigned long при необходимости.
Можно форсировать целую константу в тип long, указав в конце букву l или L. В Таблице 2.7 показаны некоторые формы целых констант long.
Константы с плавающей точкой
Константы с плавающей точкой всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. В данном случае знак минус интерпретируется как арифметический оператор.
Все константы с плавающей точкой имеют тип double.
Следующие примеры иллюстрируют некоторые формы констант и выражений с плавающей точкой:
Символьные константы
«Символ» в синтаксисе может быть любым символом из представительной таблицы символов (включая любую управляющую последовательность), кроме одиночной цитатной скобки (‘), символа обратного деления (\) или символа новой строки (\n). Для использования в качестве символьной константы одиночной цитатной скобки или символа обратного деления нужно поставить перед ними символ обратного деления, как это показано в Таблице 2.8.
Строковые литералы
Для форсированного перехода на новую строку в строковом литерале нужно в месте предполагаемого разрыва строки вставить управляющую последовательность перехода на новую строку (\n), следующим образом:
Можно использовать конкатенацию строк везде, где был использован символ обратного деления за которым стоит символ новой строки для ввода нескольких строк. Строки могут начинаться в любой колонке исходного текста без какого-либо эффекта при выводе на экран, поэтому их нужно размещать так, чтобы улучшить восприятие исходного текста. Например, следующий указатель инициализирован, как две отдельные строки литералов, с разделительным символом между ними, хранится как одна строка. При ссылке на него, как это проделано в следующем примере, получим результат, идентичный предыдущему примеру:
Символы строки хранятся последовательно в непрерывной области памяти. Пустой символ (представленный управляющей последовательностью \0) автоматически добавляется в конец строки и отмечает конец каждого строкового литерала. Каждая строка программы рассматривается отдельно, однако не гарантируется, что две идентичные строки получат разные места памяти. Кроме того, программы должны быть разработаны таким образом, чтобы не допускать в процессе своего выполнения модификации строковых литералов.
Строковые литералы имеют тип массива char (char[]). Это значит, что строка это массив элементов типа char. Число элементов массива равно числу символов в строке плюс один для заканчивающего пустого символа.
Идентификатор создается его заданием в объявлении переменной, типа или функции. После этого его можно использовать в операторах программы для ссылки на связанный с ним элемент. Хотя метки и являются специальным видом идентификаторов и имеют собственный класс, их создание аналогично созданию идентификаторов для переменных и функций. (Определения описаны в главе «Определения», а метки описаны в главе «Операторы».)
Компилятор С рассматривает прописные и строчные буквы как разные символы, поэтому можно создать разные идентификаторы с одинаковым произношением, но с одной или несколькими буквами иного размера.
Идентификаторы не могут иметь произношение и написание, совпадающее с ключевыми словами языка. Ключевые слова описаны в разделе «Ключевые слова».
Не следует использовать символ подчеркивания в начале идентификатора: в этом случае идентификаторы могут вызвать конфликт с именами системных программ и переменных, и вызвать ошибки. Не гарантируется мобильность программ, имена которых начинаются с подчеркивания.
Некоторые компоновщики могут ограничить число и тип символов для времени и сферы действия глобальных величин. (Время и сфера действия рассматривается в одноименном разделе.) Кроме того, компоновщик в отличие от компилятора, не делает различий для прописных и строчных букв. Следует найти в документации на компоновщик налагаемые им ограничения на имена.
Приведем ряд примеров для идентификаторов:
«Ключевые слова» это заранее определенные идентификаторы, которые имеют для компилятора С специальное значение. Их можно использовать только так, как они определены. Имя элемента программы не может совпадать по произношению и написанию с ключевым словом.
В языке С имеются следующие ключевые слова:
Ключевое слово volatile реализовано синтаксически, но в настоящий момент не имеет какой-либо привязанной к ней семантики. Нельзя использовать volatile в качестве имени переменной в программе.
Комментарии могут появляться везде, где допустимо появление разделительных символов. Комментарий рассматривается компилятором как единичный разделительный символ, поэтому нельзя включать комментарии с лексемами. Однако, из-за того, что компилятор игнорирует символы комментария, в его текст можно включать ключевые слова без появления ошибок.
Для подавления компиляции большой части программы или сегмента программы содержащей комментарии, следует заключить нужную часть программы в скобки директив предпроцессора #if и #endif, а не выделять эту часть программы комментариями (см. «Условная компиляция»).
Приведем ряд примеров, иллюстрирующих комментарии:
В исходном тексте программы на языке С компилятор распознает основные элементы из групп символов, называемые «лексемами». Лексема это текст исходной программы, который компилятор не анализирует на входящие в него компоненты.
Например, в следующем фрагменте программы слово elsewhere использовано в качестве имени функции. Хотя else и является ключевым словом в С, конфликта между лексемой имени функции и лексемой ключевого слова С не не происходит.
Примерами лексем служат могут служить описанные в данной главе операторы, константы, идентификаторы и ключевые слова. Также являются лексемами такие символы пунктуации, как прямоугольные ([]), фигурные (<>) и угловые скобки (<>), двоеточие и запятая.
Лексемы отделяются разделительными символами и другими лексемами, например, операторами и символами пунктуации. Для предотвращения разбивки компилятором элементов на две или несколько лексем, в идентификаторах, многосимвольных операторах и ключевых словах запрещено использование разделительных символов.
Когда компилятор интерпретирует лексемы, он пытается включить в отдельную лексему как можно больше символов до перехода к следующей лексеме. Из-за этой особенности компилятор может неверно интерпретировать лексемы, если они не выделяются разделительными символами.
Рассмотрим следующее выражение:
В данном примере компилятор сначала пытается выделить максимально длинный оператор (++) из трех знаков плюс. Оставшийся оператор плюс рассматривается как оператор сложения (+). Т.о. выражение интерпретируется как (i++)+(j), а не как (i)+(++j). В данном случае и в аналогичных случаях нужно использовать разделительные символы и скобки для исключения неоднозначности и обеспечения корректного вычисления выражений. Вперед Назад Содержание
Программирование с нуля
Данная статья описывает основные конструкции в программировании и предназначена для тех, кто хочет в этом разобраться. Но статья не описывает все нюансы, потому что их слишком много. Если описывать их все, будет очень нудно и непонятно.
Использовать будем си-подобный синтаксис, то есть подобный языку си, но не будем вникать в заголовочные файлы, указатели и другие особенности относительно низкоуровневых языков, перейдём на синтаксис более высокоуровневых языков, которые сделают рутинную работу за нас. А конкретно, будем использовать синтаксис языка Java. Добро пожаловать под кат.
Двоичная система счисления
Числа в двоичной системе счисления состоят всего из двух знаков. Нуля и единицы. 00000001 – число один. 00000010 – число два. 00000100 – число 4. Как вы можете заметить, когда единица смещается влево, число увеличивается в два раза. Чтобы получилось число 3, необходимо написать 00000011. Таким образом можно составить все необходимые числа. В данном примере мы использовали двоичное число с восемью знаками, иначе говоря число восьмиразрядное. Чем больше у числа разрядов, тем большее оно может вместить значение. Например, восьмиразрядное число вмещает максимальное значение 255, если считать ноль, тогда 256, а в программировании ноль считается всегда. Если увеличить разряд на один, получится девятиразрядное число и его вместимость увеличится в два раза, то есть станет 512. Но так в программировании никогда не делается и обычно каждая следующая разрядность увеличивается вдвое. Один разряд, потом 2 разряда, потом 4 разряда, потом 8 разрядов, потом 16 разрядов, потом 32 разряда и далее.
Шестнадцатеричная система счисления
Всё аналогично двоичной, только вместо нулей и единиц участвуют цифры от 0 до 15. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, где A – 10, B – 11, C – 12, D – 13, E – 14, F – 15.
Знак минус в программировании
Знак минус в двоичной системе счисления обозначается единицей в самом старшем разряде. Конечно же если число может быть минусовым (да, да, в программировании типы цифр бывают неминусовыми и включающим числа со знаком минус). 10000000 – число -1. Это не число -0, потому что минус нулей не бывает, то есть отрицательные числа смещаются влево на один. А вообще, в разных языках программирования может быть разное представление отрицательных чисел, но вам это знание вряд ли пригодится, поэтому пока что думайте, что всё так, как я объяснил.
Буквы и знаки
Буквы, знаки, смайлики и так далее обозначаются также числами. Буква А может быть числом 00000001 или любым другим, или даже комбинацией чисел в зависимости от кодировки символов. Кодировок много.
Типы данных
В программировании есть типы данных. Числовые, такие как 233, которые разобрали выше. Называются почти везде int, от слова integer. С плавающей запятой, такие как 198,76, называются почти везде float. У букв тип char, у строк тип String. Тип bool имеет два значения – истина (true) и ложь (false). У этого типа реализация в разных языках разная, но самая простая, когда ноль — значит ложь, а любое другое число истину. Нестандартные типы данных, такие как числа с фиксированной запятой, рассматривать не будем.
Применение
Прежде чем использовать числа в программировании их нужно объявить, то есть сказать с помощью языка программирования, что они существуют.
Это стандартное объявление примитивного типа.
Сначала пишем тип, потом имя переменной, то есть нашего числа. Всегда заканчиваем наше выражение, да и любое, точкой с запятой.
Теперь мы можем использовать переменную по её имени.
Здесь мы присвоили переменной значение. В отличии от математики в программировании = значит взять значение справа и присвоить переменной слева. = — это знак/оператор присвоения.
Можно объединить объявление и присвоение, то есть сразу инициализировать переменную.
Буквы выделяются одинарными кавычками, строки выделяются двойными кавычками. Числа типа int не выделяются.
К числам с плавающей запятой одинарной точности в конце добавляется f.
К числам с плавающей запятой двойной точности ничего не добавляется.
Операторы
С помощью операторов можно складывать, вычитать и делать много других операций с переменными. Операторами являются +, -, *, / и другие. Да даже; является оператором, говорящим, что выражение завершено.
После того как мы записали наше выражение, например сложения,
получается значение. Но так как оно ни одной переменной не присваивается, оно исчезает. Чтобы присвоить значение переменной используется специальный оператор присвоения, который коротко описан выше.
Повторим ещё раз. Он берёт значение со своей правой стороны и присваивает его переменной в левой стороне. Это оператор =, и он не имеет ничего общего со знаком равно из математики.
Также у нас есть логические операторы, такие как < (меньше), > (больше), <= (меньше либо равно), == (равно), && (и), || (или) и другие.
Они сравнивают значения или выражения слева и справа, а после выдают истинность в виде типа bool, то есть true или false, и это значение также можно присвоить.
Оператор && (и) сравнивает два значения типа bool. Если слева true и справа true, тогда этот оператор возвращает значение true. В других случаях false.
Оператор || (или) возвращает истинность, если хоть одно значение истинно (true).
Комментарии
Комментарии нужны для того, чтобы не забыть, что мы напрограммировали или они информируют тех, кто будет пользоваться нашим кодом. Попросту заметки в коде.
Однострочные комментарии открываются знаками // и заканчиваются в конце строки.
Вторая строка уже не комментарий.
Есть также многострочные комментарии и другие, которые я рассматривать не буду.
Операторы ветвления
Оператор ветвления if
Если переменная a меньше 154, то есть выражение истинно, выполняет код в фигурных скобках, потом программа выполняется дальше. Код в фигурных скобках называется блоком кода. Он нужен для того, чтобы сказать программе, что этот код принадлежит оператору и именно его нужно выполнить.
Оператор ветвления if можно расширить.
Если условие оператора истинно, выполняет первый блок кода, а если нет, тогда второй блок кода после else.
Оператор ветвления switch
Этот оператор сравнивает значение в круглых скобках со значениями после case. Если значения совпадают, выполняет выражение или выражения после case, доходит до оператора break, после выходит из цикла и продолжает программу дальше. Если ни одно значение не совпадает, выполняет выражение после default. default можно и не писать.
Циклы
Цикл for
Циклы выполняют блок кода по кругу, пока определённое действие их не остановит.
За круглыми скобками в порядке очереди идут инициализация переменной, которая будет счётчиком, условие, при котором цикл выполняется вновь и вновь при истинности условия, выражение, которое выполняется после того, как выполнится блок кода цикла. То есть этот цикл будет выполняться снова и снова, пока переменная i больше либо равна нулю, и, начиная со второго выполнения цикла, значение переменной i будет уменьшаться на единицу. После того, как условие станет ложным, программа начнёт выполняться дальше.
Цикл while
Цикл while выполняется до тех пор, пока условие в круглых скобках истинно.
Если условие будет ложным, но нам необходимо чтобы цикл выполнился один раз, тогда используем следующую конструкцию
Область видимости
Также фигурными скобками определяется область видимости. Все переменные, объявленные внутри фигурных скобок, невидимы во внешней области, но внешняя область видна внутри фигурных скобок. Поэтому мы можем использовать внутри фигурных скобок внешние переменные, но не можем во внешней области использовать переменные, объявленные внутри внутренней области.
Ключевые слова
В языках программирования есть наборы ключевых слов, в каждом языке свой набор. Этими словами ничего называть нельзя. Ни переменные, ни методы/функции, ничего подобного. Слово while ключевое и другие подобные слова также ключевые.
Массивы
Массивы – это набор значений одного типа. Они удобны, когда нам нужно что-то перечислить.
Так выглядит обычное объявление массива. Сначала указываем нужный тип. Потом ставим квадратные скобки, этим говорим языку программирования, что объявляем массив. Далее вписываем его имя. После знака присвоения вписываем выражение инициализации, то есть создания массива. Там мы видим новый оператор new, который используется при создании массива. Если сказать проще, мы создаём семь переменных типа int и присваиваем их нашему массиву под именем items.
Мы создали массив с семью элементами, но обращаться к первому начинаем с 0. Поэтому последний элемент будет под индексом 6. Не забывайте об этом смещении.
Обращение к элементу массива и присвоение его переменной выглядит так
Вход в программу
Мы рассмотрели все основные моменты, чтобы хоть что-то понимать, поэтому теперь перейдём к написанию простой программы.
Началом программы является метод main. Любой метод подобен блоку кода, но с именем. Его можно вызвать из другой части программы по имени, но метод main нельзя, потому что он вход в программу, а вход должен быть один. Метод main срабатывает только при запуске.
А это простейший метод, который сейчас разберём. В круглых скобках указываются входные параметры. Можете их представить, как уже объявленные переменные в блоке кода, которым мы можем присвоить значения извне. Внутри фигурных скобок первый оператор, который мы видим, это return. Он берёт значение справа, которое получается из выражения, и передаёт его вовне. Тип передаваемого вовне значения должен быть таким же, как указанный перед именем метода, то есть int.
Так метод вызывается и результат его выполнения передаётся в переменную z.
В этом примере сначала создаётся класс HelloWorld. Пока что думайте, что класс – это файл, в который мы записываем текст программы.
Далее идёт объявление метода main. По словам слева от его имени мы можем понять, что метод публичный (слово public), то есть мы можем вызвать его не только из этого класса, но и извне. По слову static мы можем понять, что метод статичный, то есть можно его вызвать без разных манипуляций, которые мы рассмотрим позже. Слово void говорит, что метод ничего не возвращает. В круглых скобках есть аргумент args[]. Этот аргумент является пустым массивом строк. Можно добавить забитый чем-то массив строк, но нам это не нужно, потому что использовать его мы не будем, а программа запустится и так.
Следующим мы видим вызов метода println, в параметр которого помещена строка Hello World. Перед ним мы видим перечисление через точки System.out. Если кратко, слово System означает, что метод println находится в классе System, а слово out – это выходной поток PrintStream, который нужен, чтобы выдать информацию вовне. В этом примере вовне — это консоль. Выходной поток out мы рассматривать не будем. Разбор потоков может вылиться в отдельную статью. Нам важно только знать, что out (объект класса PrintStream) находится в классе System, а метод println находится в объекте out. Все эти перечисления через точку просто указывают путь языку программированию к методу println, чтобы он знал откуда его вызывать.
Этот метод выводит строку Hello World в консоль и переводит курсор на новую строку. На этом программа заканчивается.
Компиляция и выполнение
Синтаксис простой программы мы рассмотрели, но не запустили её. Этим мы сейчас и займёмся.
Для начала скачайте JDK и установите его. Потом в переменных средах вашей операционной системы пропишите в переменной Path путь к папке bin вашего установленного JDK. Это нужно, чтобы операционная система могла найти из консоли программы JDK для компиляции и запуска. Теперь поместите текст программы в текстовый файл с именем HelloWorld. С именем HelloWorld, потому что имя файла и класса должны совпадать. Сохраните и измените расширение файла на java. Перейдите в консоли в папку с файлом и введите javac HelloWorld.java. Программа скомпилируется и поместится в файл HelloWorld.class. Чтобы запустить её напишите java HelloWorld. В выводе вы увидите Hello World. Что мы и хотели.
Импорт
Чтобы использовать другие классы и методы из стандартной библиотеки используем слово import.
После слова import идёт название пакета java.util. Он назван так из-за назначения и, собственно, из-за папок java и util, в которых находится класс Random. Путь java\util\Random.class
Вместо java.util.Random можно вписать любой необходимый нам класс.
Классы и объекты. Статические и динамические реализации
Создадим два класса. Эти классы должны находиться в одной папке, чтобы после компиляции они смогли найти друг друга.
Есть ещё множество способов, чтобы классы могли найти друг друга. Это пакеты, внешние библиотеки, внутрипакетное взаимодействие и другое. Здесь разбирать это не будем. Просто знайте, что есть специальные конструкции и ключевые слова, чтобы использовать эти механизмы.
Разберём их. Начнём с класса AnotherClass. Перед его именем мы видим слово public, которое говорит, что класс публичный и его могут использовать другие классы. В нём мы создаём переменную a со значением 9 и метод addition. Можно сказать, что класс AnotherClass – это новый тип.
В классе MyClass мы создаём объект object0 класса AnotherClass. Это очень похоже на создание обычной переменной и также используется ключевое слово new, как при создании массива. Оператор new говорит языку программирования, что нужно создать копию этого класса в оперативной памяти. Мы можем создать множество копий и забить ими всю память. Далее мы передаём переменную a этого объекта в метод println. Dызываем динамические метод addition в параметре метода println. Метод addition вернёт результат, а метод println выведет его.
Динамический метод отличается от статического тем, что его можно вызвать только из объекта, загруженного в память. То есть для начала нужно создать объект. Статический метод можно вызывать напрямую из класса, то есть просто написав имя класса, поставить точку и через неё вызвать метод. Но у статических методов есть ограничения. Внутри их тела невозможно обращаться к динамическим переменным объекта класса, в котором находятся эти методы. Так как статический метод не загружается в оперативную память, в нём нельзя использовать переменные объекта, загруженные в неё.
Чтобы создать статический метод, перед его именем нужно написать static.
Конструкторы
В этих классах почти всё идентично предыдущим, но создаётся два объекта класса AnotherClass2. object0 и object1. Но создаются они по-разному.
Разберём класс AnotherClass2. В нём появился новый механизм, который называется конструктор. Конструкторов в классе может быть несколько, начинаются они со слова public, а далее идёт имя класса. В круглых скобках перечисляются параметры, а в теле конструктора описывается инициализация объекта класса. Конструкторы схожи с методами.
Перейдём к разбору конструкторов в классе MyClass2. В этом классе при создании объектов класса AnotherClass2 мы можем указать параметры в круглых скобках. Язык программирования выберет подходящий под параметры конструктор и проинициализирует объект подходящим образом. Так при создании объектов мы можем создать его разновидность нужную нам.