Выбрать главу

х = х А у.

х = х « 1:

х = х » 1;

х = х »> 1:

// Совмещенное присваивание: х += у: х -= у. х *= у: х /= у: х у. х «= 1. х »= 1: х »>= 1: х &= у: х А= у: х |= у.

// Приведение-

операции:

//! boolean b = (boolean)x: . char с = (char)x.

byte В = (byte)x; short s = (short)x; int i = (int)x; float f = (float)x; double d = (double)x;

}

void floatTest(float x, float y) { // Арифметические операции: x = x * у, x = x / у. х = х % у; х = х + у: х = х - у; х++; х- -; х = +у; х = -у;

// Операции сравнения и логические операции:

f(x > у);

f(x >= у).

f(x < у);

f(x <= у),

f(х == у):

f(х != у),

//! f(!x):

//! f(х && у):

//! f(x || у):

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

//! х = ~у;

//! х - х & у;

//! х = х | у;

//! х = х х у:

//! х = х « 1:

//! х = х » 1:

//! х = х »> 1;

// Совмещенное присваивание:

х += у:

х -= у;

х *= у:

х /= у;

х у;

//! х «= 1;

//! х »= 1:

//! х »>= 1:

//! х &= у;

//! х А= у;

//! х |= у;

// Приведение:

//! boolean b = (boolean)x;

char с = (char)x;

byte В = (byte)x;

short s = (short)x,

int i = (int)x;

long 1 = (long)x;

double d = (double)x:

}

void doubleTest(double x. double y) { // Арифметические операции:

х = х * у; х = х / у. х = х % у, х = х + у; х = х - у. х++, х- -; х = +у. х = -у;

// Операции сравнения и логические операции:

f(x > у).

f(x >= у):

f(x < у),

f(x <= у).

f(x == у);

f(x '= у):

//! f(!x).

//! f(x && у).

//! f(x || у):

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

//! х = ~у:

//! х = х & у,

//! х = х | у:

//! х = хАу;

//! х = х « 1:

//! х = х » 1;

//! х = х »> 1;

// Совмещенное присваивание:

х += у.

х у,

х *= у,

х /= у;

х %= у:

//! х «= 1;

//! х »= 1.

//! х »>= 1,

//! х &= у.

//! х ж= у:

//! х |= у:

// Приведение-

//! boolean b = (boolean)x.

char с = (char)x:

byte В = (byte)x:

short s = (short)x,

int i = (int)x;

long 1 = (long)x;

float f = (float)x:

}

} /// ~

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

В случае с типами char, byte и short можно заметить эффект повышения при использовании арифметических операторов. Любая арифметическая операция с этими типами дает результат типа int, который затем нужно явно приводить к изначальному типу (сужающее приведение, при котором возможна потеря информации). При использовании значений типа int приведение осуществлять не придется, потому что все значения уже имеют этот тип. Однако не заблуж¬дайтесь относительно безопасности происходящего. При перемножении двух достаточно больших целых чисел int произойдет переполнение. Следующий пример демонстрирует сказанное:

// operators/Overflow java

// Сюрприз! В Java можно получить переполнение.

public class Overflow {

public static void main(String[] args) { int big = Integer MAX_VALUE; System, out. рппЫпСболыиое = " + big); int bigger = big * 4;

System.out.printlnCeiue больше = " + bigger);

}

} /* Output большое = 2147483647 еще больше = -4 *///.-

Компилятор не выдает никаких ошибок или предупреждений, и во время ис¬полнения не возникнет исключений. Язык Java хорош, но хорош не настолько.

Совмещенное присваивание не требует приведения для типов char, byte и short, хотя для них и производится повышение, как и в случае с арифметиче¬скими операциями. С другой стороны, отсутствие приведения в таких случаях, несомненно, упрощает программу.

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

Резюме

Читатели с опытом работы на любом языке семейства С могли убедиться, что операторы Java почти нйчем не отличаются от классических. Если же материал этой главы показался трудным, обращайтесь к мультимедийной презентации «Thinking in С» (www.MindView.net).

Управляющие конструкции

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

В Java задействованы все управляющие конструкции языка С, поэтому чита¬телям с опытом программирования на языке С или С++ основная часть мате¬риала будет знакома. Почти во всех процедурных языках поддерживаются стандартные команды управления, и во многих языках они совпадают. В Java к их числу относятся ключевые слова if-else, while, do-while, for, а также команда выбора switch. Однако в Java не поддерживается часто критикуемый оператор goto (который, впрочем, все же является самым компактным решением в неко¬торых ситуациях). Безусловные переходы «в стиле» goto возможны, но гораздо более ограничены по сравнению с классическими переходами goto.

true и false

Все конструкции с условием вычисляют истинность или ложность условного выражения, чтобы определить способ выполнения. Пример условного выраже¬ния — А — В. Оператор сравнения = проверяет, равно ли значение А значению В. Результат проверки может быть истинным (true) или ложным (false). Любой из описанных в этой главе операторов сравнения может применяться в условном выражении. Заметьте, что Java не разрешает использовать числа в качестве ло¬гических значений, хотя это позволено в С и С++ (где не-ноль считается «ис¬тинным», а ноль — «ложным»). Если вам потребуется использовать числовой тип там, где требуется boolean (скажем, в условии if(a)), сначала придется его преобразовать к логическому типу оператором сравнения в условном выраже¬нии — например, if (а != 0).

if-else

Команда if-else является, наверное, наиболее распространенным способом пере¬дачи управления в программе. Присутствие ключевого слова else не обязатель¬но, поэтому конструкция if существует в двух формах:

if(логическое выражение) команда

и

if(логическое выражение) команда

else

команда

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

В качестве примера применения if-else представлен метод test(), который вы¬дает информацию об отношениях между двумя числами — «больше», «меньше» или «равно»:

//. control/IfElse.java

import static net.mindview.util.Print.*;

public class IfElse {

static int result = 0; static void test(int testval. int target) { if(testval > target) result = +1; else if(testval < target) result = -1:

else

result = 0; // равные числа

}

public static void main(String[] args) { test(10. 5); print(result); test(5. 10); print(result); test(5. 5); print(result);

}

} /* Output:

1

-1

0

Внутри метода test() встречается конструкция else if; это не новое ключевое слово, a else, за которым следует начало другой команды — if.