х = х А у.
х = х « 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.