Операторы в языке программирования Java

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

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

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

Набор операторов языка Java включает:

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

- операторы-выражения;

- операторы присваивания;

- условный оператор if;

- три оператора цикла while, do-while, for;

- оператор варианта switch;

- операторы перехода break, continue и return;

- блок {};

- пустой оператор – просто точка с запятой.

Замечание. В языке Java нет оператора goto. Всякий оператор завершается точкой с запятой.

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

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

Блок. Блок заключает в себе нуль или несколько операторов с целью использовать их как один оператор в тех местах, где по правилам языка можно записать только один оператор. Например, {х = 5; у = ?;}. Можно записать и пустой блок, просто пару фигурных скобок {}.

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

Операторы присваивания. Точка с запятой в конце любой операции присваивания превращает ее в оператор присваивания. Побочное действие операции – присваивание – становится в операторе основным.

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

Условный оператор. Условный оператор (if-then-else statement) в языке Java записывается так:

if (логВыр) оператор1 else оператор2

и действует следующим образом. Сначала вычисляется логическое выражение логвыр. Если результат true, то действует оператор1 и на этом действие условного оператора завершается, оператор2 не действует, далее будет выполняться следующий за if оператор. Если результат false, то действует оператор2, при этом оператор1, вообще не выполняется.

Условный оператор может быть сокращенным (if-then statement):

if (логВыр) оператор1

и в случае false не выполняется ничего.

Синтаксис языка не позволяет записывать несколько операторов ни в ветви then, ни в ветви else. При необходимости составляется блок операторов в фигурных скобках. Соглашения «Code Conventions» рекомендуют всегда использовать фигурные скобки и размещать оператор на нескольких строках с отступами, как в следующем примере:

if (а < х) {

х = а + b;

}

else {

х = а - b;

}

Очень часто одним из операторов является снова условный оператор, например:

if (n == 0)

{

sign = 0;

}

else if (n < 0){

sign = -1;

} else {

sign = 1;

}

При этом может возникнуть такая ситуация («dangling else»):

int ind = 5, х = 100;

if (ind >= 10) if (ind <= 20) x = 0; else x = 1;

Сохранит переменная х значение 0 или станет равной 1? Здесь необходимо волевое решение, и общее для большинства языков, в том числе и Java, правило таково: ветвь else относится к ближайшему слева условию if, не имеющему своей ветви else. Поэтому в нашем примере переменная х останется равной 0.

Изменить этот порядок можно с помощью блока:

if (ind > 10) {if (ind < 20) x = 0; else x = 1;}

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

if (ind >= 10 && ind <= 20) х = 0; else х = 1;

В приведенном ниже листинге вычисляются корни квадратного уравнения ах 2 + bх + с = 0 для любых коэффициентов, в том числе и нулевых.

import java.util.Scanner;

public class hello_world {

public static void main(String args[]) {

double a,b,c;

double x,x1,x2;

double d,z;

Scanner s = new Scanner(System.in);

System.out.println(«Введите число а = «);

a = s.nextInt();

System.out.println(«Введите число b = «);

b = s.nextInt();

System.out.println(«Введите число c = «);

c = s.nextInt(); //Решение квадратного уравнения вида a*x*x+b*x+c=0

if (a!=0.0)

{d=b*b-4*a*c;

z=Math.sqrt(d);

if (d>0)

{x1=(-b+z)/2/a;

x2=(-b-z)/2/a;

System.out.println(«x1=«+x1);

System.out.println(«x2=«+x2);}

if (d==0)

{x=-b/2/a;

System.out.println(«Корень уравнения равен «+x);}

if (d<0)

{System.out.println(«Уравнение не имеет корней»);}

}

else

{System.out.println(«Уравнение не является квадратным»);}

}

}

Операторы цикла. Основной оператор цикла – оператор while – выглядит так:

while (логВыр) оператор

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

Оператор в цикле может быть и пустым, например, следующий фрагмент кода:

int i = 0;

double s = 0.0;

while ((s += 1.0 / ++i) < 10);

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

Можно организовать и бесконечный цикл:

while (true) оператор

Конечно, из такого цикла следует предусмотреть какой-то выход, например, оператором break. В противном случае программа зациклится, и вам придется прекращать ее выполнение «комбинацией из трех пальцев» <Ctrl>+<Alt>+<Del> в MS Windows 95/98/ME, комбинацией <Ctrl>+<C> в UNIX или через Task Manager в Windows NT/2000.

Если в цикл надо включить несколько операторов, то следует образовать блок операторов {}.

import java.util.Scanner;

public class hello_world {

public static void main(String args[]) {

Scanner s = new Scanner(System.in);

int n;

int s1=0;

int k=1;

System.out.println(«Введите число n = «);

n = s.nextInt();

while(k<=n)

{

s1+=k*k;

k++;

}

System.out.println(«Сумма: « +s1);

System.out.println(«Готово!»);

}

}

Второй оператор цикла – оператор do-while – имеет вид

do оператор while (логВыр)

Здесь сначала выполняется оператор, а потом происходит вычисление логического выражения логвыр. Цикл выполняется, пока логвыр остается равным true.

Существенное различие между этими двумя операторами цикла только в том, что в цикле do-while оператор обязательно выполнится хотя бы один раз.

import java.util.Scanner;

public class hello_world {

public static void main(String args[]) {

Scanner s = new Scanner(System.in);

int num;

int nextdigit;

System.out.println(«Введите число num = «);

num = s.nextInt();

System.out.println(«Число с обратным порядком цифр: «);

do

{ nextdigit = num % 10;

System.out.print(nextdigit);

num = num / 10;

}

while (num > 0);

}

}

Третий оператор цикла – оператор for выглядит так:

for ( списокВыр1 ; логВыр; слисокВыр2) оператор

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

Затем вычисляется логическое выражение логвыр. Если оно истинно, true, то действует оператор, потом вычисляются слева направо выражения из списка выражений списокВыр2. Далее снова проверяется логвыр. Если оно истинно, то выполняется оператор и списокВыр2 и т. д. Как только логвыр станет равным false, выполнение цикла заканчивается.

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

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

for (;;) оператор

В этом случае в теле цикла следует предусмотреть какой-нибудь выход.

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

import java.util.Scanner;

public class hello_world {

public static void main(String args[]) {

int s1=0;

int n;

Scanner s = new Scanner(System.in);

System.out.println(«Введите число n = «);

n = s.nextInt();

for (int k = 1; k <= n; k++) s1 += k * k;

System.out.println(«Сумма: « +s1);

System.out.println(«Готово!»);

}

}

вычисляет сумму квадратов первых N натуральных чисел.

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

for (int i = 0; i < N; i++){

if (i == j) continue;

s += 1.0 / (i - j);

}

Вторая форма содержит метку:

continue метка

метка записывается, как все идентификаторы, из букв Java, цифр и знака подчеркивания, но не требует никакого описания. Метка ставится перед оператором или открывающей фигурной скобкой и отделяется от них двоеточием. Так получается помеченный оператор или помеченный блок.

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

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

Оператор break метка

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

Ml: { // Внешний блок

М2: { // Вложенный блок – второй уровень

М3: { // Третий уровень вложенности...

if (что-то случилось) break M2;

// Если true, то здесь ничего не выполняется

}

// Здесь тоже ничего не выполняется

}

// Сюда передается управление

}

Поначалу сбивает с толку то обстоятельство, что метка ставится перед блоком или оператором, а управление передается за этот блок или оператор. Поэтому не стоит увлекаться оператором break с меткой.

Оператор варианта. Оператор варианта switch организует разветвление по нескольким направлениям. Каждая ветвь отмечается константой или константным выражением какого-либо целого типа (кроме long) и выбирается, если значение определенного выражения совпадет с этой константой. Вся конструкция выглядит так.

switch (целВыр){

case констВыр1: оператор1

case констВыр2: оператор2

. . . . .

case констВырN: операторN

default: операторDef

}

Стоящее в скобках выражение целвыр может быть типа byte, short, int, char, но не long. Целые числа или целочисленные выражения, составленные из констант, констВыр тоже не должны иметь тип long.

Оператор варианта выполняется так. Все константные выражения вычисляются заранее, на этапе компиляции, и должны иметь отличные друг от друга значения. Сначала вычисляется целочисленное выражение; целВыр. Если оно совпадает с одной из констант, то выполняется оператор, отмеченный этой константой. Затем выполняются («fall through labels») все следующие операторы, включая и операторDef, и работа оператора варианта заканчивается.

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

Таким образом, константы в вариантах case играют роль только меток, точек входа в оператор варианта, а далее выполняются все оставшиеся операторы в порядке их записи.

import java.util.Scanner;

public class hello_world {

public static void main(String args[]) {

Scanner s = new Scanner(System.in);

int n;

System.out.println(«Введите номер месяца,когда вы родились = «);

n = s.nextInt();

switch (n){

case 1:

System.out.println(«Вы родились в Январе»);

break;

case 2:

System.out.println(«Вы родились в Феврале»);

break;

case 3:

System.out.println(«Вы родились в Марте»);

break;

case 4:

System.out.println(«Вы родились в Апреле»);

break;

case 5:

System.out.println(«Вы родились в Мае»);

break;

case 6:

System.out.println(«Вы родились в Июне»);

break;

case 7:

System.out.println(«Вы родились в Июле»);

break;

case 8:

System.out.println(«Вы родились в Августе»);

break;

case 9:

System.out.println(«Вы родились в Сентябре»);

break;

case 10:

System.out.println(«Вы родились в Октябре»);

break;

case 11:

System.out.println(«Вы родились в Ноябре»);

break;

case 12:

System.out.println(«Вы родились в Декабре»);

break;

default:

System.out.println(«Вы родились не на земле)»);

break;

}}}

ПРАКТИЧЕСКАЯ РАБОТА

Наши рекомендации