14

14


int i = (int)x:



long 1 = (long)x:



float f = (float)x.



double d = (double)x,



}



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



x = (short)+y, x = (short)-y;



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



f(x > у);



f(x >= у):



f(x < у):



f(x <= у);



f(x == у);



f(x != у);



//! f(!x);



//! f(x && у);



//! f(x || у):



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



х = (short)~у,



х = (shortKx & у);



х = (shortKx | у):



х = (short)(х А у):



х = (shortKx « 1);



операции:



х = (shortKx » 1);



х = (short)(х »> 1); // Совмещенное присваивание: х += у. х -= у. х *= у. х /= у: х %= у: х «= 1.



X »= 1. X »>= 1.



X &= у: х А= у. х |= у:



// Преобразование



//> boolean b = (boolean)x.



char с = (char)x.



byte В = (byte)x,



int i = (int)x.



long 1 = (long)x,



float f = (float)x;



double d = (double)x.



}



void intTest(int x, int y) {



// Арифметические операции:



x = x * у:



x = x / у.



х = х % у,



х = х + у,



х = х - у,



х++;



х- -:



х = +у;



х = -у.



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



f(х > у).



f(х >= у).



f(х < у):



f(x <= у):



f(х == у).



f(х у).



//! f(!x):



//' f(x && у).



//! f(x || у),



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



х = -у.



X = X & у,



X = X I у,



х = х А у:



х = х « 1;



х = х » 1:



х = х »> 1.



// Совмещенное присваивание- х += у; х -= у. х *= у. х /= у. х Х- у, х «= 1;






X »= 1.



х »>= 1; х &= у; х А= у. х |= у:



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



//' boolean b = (boolean)x;



char с = (char)x,



byte В = (byte)x;



short s = (short)x;



long 1 = (long)x;



float f = (float)x,



double d = (double)x;



}



void longTestdong x, long y) {



// Арифметические операции:



x = x * у:



x = x / у;



x = x % у.



х = х + у:



х = х - у,



х++,



х- -;



х = +у;



х = -у:



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



f(х > у):



f(х >= у):



f(х < у),



f(х <= у):



f (х == у).



f(х != у).



//! 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; 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.



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






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



Циклы



Конструкции while, do-while и for управляют циклами и иногда называются цик¬лическими командами. Команда повторяется до тех пор, пока управляющее логи¬ческое выражение не станет ложным. Форма цикла while следующая:



\л/ИПе(логическое выражение) команда



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



Следующий простой пример генерирует случайные числа до тех пор, пока не будет выполнено определенное условие:



//: control/WhileTest java // Пример использования цикла while



public class WhileTest {



static boolean conditionO {



boolean result = Math.randomO < 0.99; System.out.print(result + "); return result;



}



public static void main(String[] args) { while(conditionO)



System out printlnC"Inside 'while"'), System.out.println("Exited 'while'");



}



} /* (Выполните, чтобы просмотреть результат) *///•-



В примере используется статический метод random() из библиотеки Math, ко¬торый генерирует значение double, находящееся между 0 и 1 (включая 0, но не 1). Условие while означает: «повторять, пока condition() возвращает true». При каж¬дом запуске программы будет выводиться различное количество чисел.



do-while



Форма конструкции do-while такова:



do



команда



и/1гЛе(логическое выражение);



Единственное отличие цикла do-while от while состоит в том, что цикл do- while выполняется по крайней мере единожды, даже если условие изначально ложно. В цикле while, если условие изначально ложно, тело цикла никогда не от¬рабатывает. На практике конструкция do-while употребляется реже, чем while.



for



103



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



осуществляется некое «приращение» (обычно изменение управляющей пере¬менной). Цикл for записывается следующим образом:



^(инициализация; логическое выражение; шаг)



команда



Любое из трех выражений цикла (инициализация, логическое выражение или шаг) можно пропустить. Перед выполнением каждого шага цикла проверяется условие цикла; если оно окажется ложно, выполнение продолжается с инструк¬ции, следующей за конструкцией for. В конце каждой итерации выполняется секция шаг.



Цикл for обычно используется для «счетных» задач:



// control/ListCharacters.java



// Пример использования цикла "for": перебор



// всех ASCII-символов нижнего регистра



public class ListCharacters {



public static void main(String[] args) { for(char с = 0, с < 128, С++)



i f(Character.i sLowerCase(c))



System out рппШСзначение- " + (int)c + " символ. " + с).



}



} /* Output- значение 97 символ a значение 98 символ b" значение 99 символ с" значение 100 символ d" значение- 101 символ: е" значение 102 символ, f" значение 103 символ, д" значение 104 символ: h" значение- 105 символ- i значение 106 символ- j



*///:-



Обратите внимание, что переменная i определяется в точке ее использова¬ния, в управляющем выражении цикла for, а не в начале блока, обозначенного фигурными скобками. Область действия для i — все выражения, принадлежа¬щие циклу.



В программе также используется класс-«обертка» java.Lang.Character, кото¬рый не только позволяет представить простейший тип char в виде объекта, но и содержит ряд дополнительных возможностей. В нашем примере используется статический метод этого класса isLowerCase(), который проверяет, является ли некоторая буква строчной.

Report Page