Операторы, выражения и ключевые слова

В

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

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

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

Операторы

примечаниеОператоры (Statements) — это основные строительные блоки, из которых создает­ся программа. Приложение или аплет начинает работу с выполнения первого опе­ратора кода и продолжается, выполняя по порядку каждый написанный вами опе­ратор.

IaiHiiiii ∣∣∣∣∣∣∣∣∣ Сказанное в предыдущем абзаце является некоторым преувеличени­ем. JVM (Java Virtual Machine — виртуальная машина Java.) на самом деле выполняет цикл обработки событий. Программа начинает работать тогда, когда генерируется событие вроде щелчка кнопкой мыши или нажатия клавиши на клавиатуре. В это время произво­дится вызов метода, находящегося в вашей программе. Затем происходит линейное вы­полнение операторов этого метода. После завершения работы метода управление передается обратно в цикл обработки событий до появления нового события. Наличие нескольких потоков в программе или JVM может еще более усложнить эту модель, но Даже в самых запутанных программах основная идея остается той же.

В Java имеется множество типов часто используемых операторов. В их число вхо­Дят операторы While, If, For, Switch, Do, Break, Continue, Throw, Catch И Sy∏chror. ized. Строка кода, в которой некоторой переменной присваивается значе­ние, является Оператором присваивания (Assignment Statement). В Java нет операторов перехода, однако есть метки. При употреблении метки оператор становится поме­ченным. Еще есть нечто, называемое пустым оператором, и описание переменной, которое тоже считается оператором. Последний называется, естественно, Операто­ром описания или Оператором объявления (Declaration Statement). Имеется еще и кон­струкция, называемая блоком. Блок (Block Statement) начинается с открывающей фи­гурной скобки и заканчивается закрывающей фигурной скобкой. Все, что находится между этими фигурными скобками, в том числе и другие операторы, может считать­ся частью большого оператора, называемого Составным оператором (Compound Statement).

В предыдущем абзаце приведен довольно полный список всех операторов, дос­тупных при построении программ на Java. Поэтому этот список может считаться до­статочно точным определением того, что такое оператор, хотя вряд ли это будет что-то значить для большинства читателей, поскольку я еще не определил, что зна­чат все эти операторы И Зачем они нужны. Но уже в следующем разделе я приведу несколько примеров операторов и, надеюсь, что мысли, высказанные в предыдущем абзаце, начнут вами слегка осознаваться. Конечно, далее я более формально опре­делю каждый из этих элементов языка.

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

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

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

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

Примеры операторов

Пора от метафор и абстрактных описаний операторов перейти к некоторым де­талям и рассмотреть, как они работают.

Вот классический и очень простой оператор: С = А + Ь; // оператор присваивания

Этот пример известен как Оператор присваивания (Assignment Statement). Его при­знаком является наличие операции присваивания, которая в Java обозначается зна­ком равенства.

Обратите внимание, что в этом операторе нет объявлений. Где-то в коде вы дол­жны объявить тип переменных А, ь И С. Например, все они могут быть типа i∏t. (Объявление локальных переменных также является оператором.)

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

Такие базовые синтаксические элементы, как операторы for, if и while, воз­можно, будут знакомы большинству читателей, кто уже имеет опыт работы с други­ми компьютерными языками. Я приведу несколько примеров таких операторов. Еще раз повторяю: не огорчайтесь, если они не знакомы вам, поскольку я более де­тально опишу эти операторы в следующей главе.

Рассмотрим следующий оператор:

If (х = 1) i = 2;

В этом коде представлен оператор if. Это один целый оператор, хотя и записан в двух строках.

Вот еще пример:

While (х < 5) х++;

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

И еще один оператор

If (а > Ь)

Ь = 0;

Else а = 0;

Это пример одного оператора, состоящего из двух частей: оператора if и пред­ложения else. Код до первой точки с запятой может рассматриваться как самостоя — те/ьный эператор. Код в предложении else не является самостоятельным; он име­ет смысл, лишь являясь частью большего оператора. И опять, пока неважно, пони­
маете ли вы, что значит этот оператор; сейчас нужно лишь увидеть, что некоторые операторы бывают и такими.

примечаниеПричина, по которой предложение else не является оператором, состоит в том, что оно ничего не значит без основного тела оператора if. Операторы должны обла­дать некоторой автономией, иначе это не операторы. Если вспомнить приведенную ранее аналогию, то здесь действует тот же принцип, что и для предложений. Пред­ложение представляет собой законченную мысль. Аналогично, оператор представ­ляет собой полностью автономный фрагмент кода, если не учитывать недостающих объявлений или возможных ссылок внутри оператора на другие функции или объекты.

Сейчас вы уже можете начать улавливать, почему операторы трудно определить иначе, чем через список синтаксических элементов наподобие тех, что при­ведены в начале данной главы. Вы уже можете с полным основанием сказать мне: "По­стой-ка, Чарли, ты только что говорил, что операторы заканчиваются точкой с запятой, а теперь ты приводишь пример того, что заканчивается точкой с запятой и не является опе­ратором". Если вы вернетесь к тем моим словам, вы увидите, что в моем определении присутствует слово "обычно", но все же наличие этих исключений для такого замеча­тельного четкого правила несколько огорчает. Но все же в подавляющем большинстве случаев мое правило работает, и я считаю, что это хорошая отправная точка для опреде­ления операторов в вашем коде. В некоторых языках в операторе if точка с запятой после строки Ь = 0 Не нужна. Эти языки считают, что раз оператор не завершен, то и Точка с запятой не нужна.

Рассмотрим следующий метод:

Int Foo()

{

Return 2;

}

Единственная строка кода этого метода, Return 2, Является полным операто­ром. Он, естественно, называется Оператором возврата {Return Statement). Существу­ет много других операторов подобного рода, таких как оператор Break И оператор Continue. (Опять-таки, я здесь не пытаюсь определить операторы Return И опера­торы Continue, А просто привожу их в качестве примера такого кода, который может быть назван оператором.) В данном случае вы можете считать этот фрагмент кода оператором, отчасти в силу наличия точки с запятой, а отчасти просто памятуя, что ключевое слово Return Является частью оператора. (Я совсем не собираюсь обра­щать ваше внимание на такие признаки, а вместо этого буду придерживаться общего правила о точке с запятой.)

Составные операторы

Вот еще один тип оператора, называемого составным оператором:

{

Int А, Ь, с; с = А + Ь; Double B = A* С;

}

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

Обратите внимание, что объявление int А, Ъ, с; Также является оператором. Он называется оператором объявления локальных переменных. Второй оператор составного оператора — это простой оператор присваивания. Последний оператор является одновременно и оператором присваивания, и оператором объявления.

Законодатели языка особенно любят всякие нетипичные случаи, наподобие Пус­того оператора {Empty Statement), который состоит только из точки с запятой. Но я не буду развивать эту тему дальше, поскольку нам не требуется подобное техничес­кое определение оператора для использования его в данной книге. Все, что я на са­мом деле пытаюсь сделать, это дать вполне пригодное рабочее определение термина и достаточно примеров, чтобы у вас появилось некоторое представление того, о чем я говорю, когда употребляю слово "оператор".

Повторяю еще раз: мы можем пользоваться двумя нечеткими правилами: боль­шинство операторов заканчиваются точкой с запятой или они заключены в фигур­ные скобки. Это определение недостаточно технично, чтобы удовлетворить законо­дателей языка, но оно поможет вам уловить общий смысл термина. Более техничес­кое определение может просто свестись к перечислению всех возможных видов операторов, таких как операторы присваивания, операторы if, операторы while, операторы switch, пустые операторы и т. д. В конце концов, вы даже можете заучить наизусть весь этот список операторов, но, пока вы еще только получаете общее представление о том, как работает язык, такие подвиги вам не нужны.

Выражения

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

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

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

Вот несколько примеров выражений:

А + Ь; // Получить результат сложения а + Ь

DoSomething(); // Вызов метода

Первое из вышеприведенных выражений не может существовать само по себе. Как и все выражения, оно выдает результат. Законодатели языка иногда называют это Представлением {Denoting) переменной или значения. Когда мы смотрим на опе­ратор С = А + Ь, То часть А + Ь и является выражением, потому что оно выдает ре­зультат, Kf торый присваивается переменной С. А переменная С Не является выраже­нием, поскольку оно не выдает результат. Это просто фрагмент кода.

Второй пример — doSomething() — это вызов метода. Может показаться, что это не выражение, поскольку результат здесь не выдается. Это просто вызов метода. Однако большинство методов возвращают значение. Даже если метод doSomething объявлен типа void (пустой), его вызов все равно считается выражением, поскольку он выдает значение типа void. Процедуры в Pascal или подпрограммы в VB обычно выдают тип void. В C++ или Java нет такого понятия, как процедура или подпрог­рамма, вместо этого есть функции или методы. В Java все методы или возвращают значение некоторого типа вроде int, или не возвращают ничего, что значит, что они возвращают значение типа void.

Вот функция, возвращающая int:

Int foo()

{

Return 2;

}

А вот функция, возвращающая void:

Void fоо()

{

Int а, b, с; с = а + Ь;

}

Простой вызов метода типа void или метода, возвращающего значение, называ­ется Оператором-выражением (Expression Statement). Это одновременно и выражение, и оператор. Сам по себе метод — это еще не выражение; это лишь вызов метода, ко­торый является выражением. Это удовлетворяет определению выражения, т. к. вызов метода выдает результат; единственная сложность здесь заключается в том, чтобы понять, что возвращаемый результат имеет тип void.

Если последний абзац непонятен вам, не волнуйтесь. Если вы новичок в языке, то есть более серьезные вещи, о которых вам стоит думать. Но все же вам стоит хотя бы попытаться понять, что А + Ь — Это выражение, потому что оно возвращает ре­зультат.

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

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

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

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

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

В каждом языке есть некоторое количество ключевых слов (Есть языки и без ключевых слов, например, Snobol IV, Lisp или РЕФАЛ, но они мало распространены или почти не применяются. В еще недавно широко распространенном языке PL/1 ключевые слова хоть и есть, но они не зарезервированы, т. е. программист может ис­пользовать их в качестве своих идентификаторов — Прим, перев.) Это слова, которые язык использует для своих собственных целей. Например, простые типы обознача­ются ключевыми словами вроде char, int, long и т. д. Эти слова резервированы для самого языка, так что вы не можете использовать их как имена переменных. Ключе­вые слова не могут применяться как идентификаторы, которые вы создаете в своих программах для собственного употребления.

Следующие объявления ошибочны:

Int return; int void; int else; long public; short int;

У всех этих объявлений одна и та же проблема: они объявляют переменные с именами, которые являются ключевыми словами: return, void, else, public и int.

Следующие объявления не содержат ошибок: Int I;

Int numHouses; long acornCount;

String myNameString;

Здесь все правильно, т. к. имена переменных — идентификаторы NumHouses, AcornCount И MyNameString — не ЯВЛЯЮТСЯ Ключевыми словами.

У ключевых слов нет какого-то общего признака. Их нужно просто помнить или найти в справочной системе. Однако помнить все ключевые слова языка нет ника­кой необходимости. Вместо этого достаточно просто почувствовать, что такое клю­чевые слова, чтобы можно было понять, на что жалуется компилятор, если вы не­умышленно попытаетесь употребить ключевое слово в качестве имени переменной. В частности, неверное употребление ключевого слова может породить сообщение об ошибке вроде "Malformed Declarations". Если вы увидите такую ошибку, од­ной из возможных причин ее возникновения может быть попытка использования ключевого слова в качестве имени переменной.

Другим способом обнаружить ключевое слово является его визуальное выделе­ние. Если какое-то слово в редакторе JBuilder выделено жирным шрифтом, то это ключевое слово.

Ниже приведен список ключевых слов языка Java на время выпуска JDK 1.2. C тех пор были добавлены и другие. Не важно, знаете ли вы, что значат эти слова, важ­но лишь гнать, что они существуют, чтобы не пытаться употребить их в своей про­грамме в ’. ачестве имен переменных.

Abstract

Do

Implements

Private

Transient

Boolean

Double

Import

Protected

True

Break

Else

Inner*

Public

Try

Byte

Extends

Instanceof

Rest*

Var*

Byvalue*

False

Int

Return

Void

Case

Final

Interface

Short

Volatile

Cast*

Finally

Long

Static

While

Catch

Float

Native

Super

Char

For

New

Switch

Class

Future*

Null

Synchronized

Const*

Generic*

Operator*

This

Continue

Goto*

Outer*

Throw

Default

If

Package

Throws

Слова, помеченные звездочками, зарезервированы, но пока не используются. Например, в Java нет оператора goto, но такое слово зарезервировано, несмотря на малую вероятность того, что оно станет ключевым.

Утверждения

Утверждения (Assertions} являются новой ключевой возможностью JDK 1.4. О них пойдет речь в главе 29, "Отладчик".

Резюме

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

Операторы являются строительными блоками, из которых собирается програм­ма. Вы видели, что существует два вида операторов* простые и составные. Простые операторы выражают законченную мысль, наподобие предложений в литературном тексте. Вы также видели, что наилучшим способом дать более точное определение оператора является просто перечисление всех возможных операторов, доступных в языке Java, таких как операторы присваивания, операторы if, операторы while и т. д. Составные операторы содержат последовательность простых операторов, заклю­ченных в фигурные скобки.

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

Ключевые слова являются ни чем иным, как списком слов, зарезервированных для применения создателями языка Java. Поэтому ключевые слова нельзя использо­вать в качестве идентификаторов переменных, объявляемых в ваших программах. Единственный способ точно знать, является ли какое-либо слово ключевым — вос­пользоваться справочным файлом или выучить список всех ключевых слов. Хотя при использовании JBuilder ключевое слово можно узнать по выделению его в ре­дакторе жирным шрифтом.

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

Чарли Калверт

Глава 11

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *