К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 16
Текст из файла (страница 16)
Класс MathКласс Math состоит из статических констант и методов, предназначенных для математических вычислений общего назначения. Все операциивыполняются в арифметике double.Константа Math.E представляет значение числа e (2.7182818284590452354), а Math.PI — значение числа p (3.14159265358979323846). Значенияуглов в методах задаются в радианах, а все параметры и возвращаемые значения имеют тип double, если явно не оговорено обратное:ФункцияЗначениеsin(a)синус acos(a)косинус atan(a)тангенс aasin(v)арксинус v, где v лежит в диапазоне [–1.0, 1.0]acos(v)арккосинус v, где v лежит в диапазоне [–1.0, 1.0]>atan(v)арктангенс v, возвращается в диапазоне [–p/2, p/2]atan2(x,y)арктангенс x/y, возвращается в диапазоне [–p, p]exp(x)expow(y,x)yxlog(x)натуральный логарифм xsqrt(x)квадратный корень из xceil(x)наименьшее целое число xfloor(x)наибольшее целое число xrint(x)возвращает округленное целое значение x в виде doubleround(x)возвращает (int)floor(x+0.5) в виде double или floatabs(x)возвращает модуль x для любого числового типаmax(x,y)возвращает наибольшее из чисел x и y, относящихся к любому числовомутипуmin(x,y)возвращает наименьшее из чисел x и y, относящихся к любому числовомутипуСтатический метод Math.IEEERemainder вычисляет остаток в соответствии со стандартом IEEE-754.
Оператор вычисления остатка %, описанный вразделе 5.15.1, подчиняется правилу(x/y)*y + x%y == xПри этом сохраняется всего один вид симметрии, а именно: если x%y равно z, то изменение знака x или y изменит знак z, но не повлияет наабсолютную величину. Например, 7%2.5 дает 2.0, а -7%2.5 равняется 2.0. Стандарт IEEE определяет поведение остатка для x и y иначе, сохраняясимметрию расположения на числовой оси — результат Math.IEEERemainder(-7, 2.5) будет равен -0.5. Оператор вычисления остатка делаетзначения симметричными относительно нуля на числовой оси, тогда как механизм работы с остатком по стандарту IEEE разносит получившиесявеличины на y единиц.
Метод присутствует потому, что обе разновидности остатка могут пригодиться.Статический метод random генерирует псевдослучайное число r в диапазоне 0,0 r 1,0. Средства для более точного управленияпсевдослучайными числами рассматриваются в разделе “Класс Random” на стр. .Упражнение 14.5Напишите программу-калькулятор, которая работает со всеми этими функциями, а также (по меньшей мере) с базовыми операторами +, -, *, / и %.Вероятно, проще всего будет реализовать калькулятор с обратной польской нотацией, поскольку приоритет операторов значения не имеет.Содержание | ДалееГлава 5ЛЕКСЕМЫ, ОПЕРАТОРЫ И ВЫРАЖЕНИЯВ этом нет ничего особенного.Все, что от вас требуется, —это нажимать нужные клавиши в нужный момент,а инструмент будет играть сам.Иоганн Себастьян БахВ этой главе рассматриваются основные “строительные блоки” Java —типы, операторы и выражения.
Мы уже видели довольно много Javaпрограмм и познакомились с их компонентами. В этой главе приводится детальное описание базовых элементов.5.1. Набор символовБольшинству программистов приходилось иметь дело с исходными текстами программ, в которых использовалось одно из двух представленийсимволов: кодировка ASCII и ее разновидности (в том числе Latin-1) и EBCDIC. Оба этих набора содержат символы, используемые в английском инекоторых других западно-европейских языках.В отличие от них, программы на языке Java написаны в Unicode — 16-разрядном наборе символов. Первые 256 символов Unicode представляютсобой набор Latin-1, а основная часть первых 128 символов Latin-1 соответствует 7-разрядному набору символов ASCII.
В настоящее времяокружение Java может читать стандартные файлы в кодировке ASCII или Latin-1, немедленно преобразуя их в Unicode. /В Java используетсяUnicode 1.1.5 с исправленными ошибками. Справочная информация приведена в разделе "Библиография"/В настоящее время лишь немногие текстовые редакторы способны работать с символами Unicode, поэтому Java распознает escapeпоследовательности вида \udddd, которыми кодируются символы Unicode; каждому d соответствует шестнадцатеричная цифра (ASCII-символы 0–9, а также a–f или A–F для представления десятичных значений 10–15). Такие последовательности допускаются в любом месте программы — нетолько в символах и строковых константах, но также и в идентификаторах.
В начале последовательности может стоять несколько u;следовательно, символ ••• записывается и как \u0b87, и как \uu0b87. /Использование "множественных u" может показаться странной, но на то естьвеские причины. При переводе Unicode-файла в формат ASCII, приходится кодировать символы Unicode, лежащие за пределами ASCII-диапазона,представляется в виде \u0b87. При обратном переводе осуществляется обратнаяв виде escape-последовательностей. Таким образом,замена; но что произойдет, если исходный текст в кодировке Unicode вместо символа ••• содержал \u0b87? В этом случае при обратной заменеисходный текст изменится (синтаксический анализатор не заметит никаких изменений - но не читатель программы!) Выход заключается в том,чтобы при прямом переводе вставлять дополнительные u в уже существующие \udddd, а при обратном - убирать их, и, если u не останется,заменять escape-последовательность эквивалентным символом Unicode./5.2.
КомментарииКомментарии в Java бывают трех видов:// комментарий - игнорируются символы от // до конца строки/* комментарий */- игнорируются символы между /* и следующим */, включаязавершающие символы строк \r, \n и \r\n./** комментарий */- игнорируются символы между /** и следующим */, включаяперечисленные выше завершающие символы. Документирующиекомментарии должны располагаться непосредственно послеобъявления класса, члена класса или конструктора; онивключаются в автоматически генерируемую документацию.Когда мы говорим “символы”, то имеем в виде любые символы Unicode. Комментарии в Java могут включать произвольные символы Unicode:“инь-янь” (\u262f), восклицание (\u203d) или “снеговика” (\u2603).В Java не разрешаются вложенные комментарии. Приведенный ниже текст (как бы соблазнительно он ни выглядел) компилироваться не будет:/* Закомментируемдо лучших времен; пока не реализовано/* Сделать что-нибудь этакое */universe.neatStuff();*/Первая комбинация символов /* начинает комментарий; ближайшая парная */ заканчивает его, оставляя весь последующий код синтаксическомуанализатору, который сообщает об оставшихся символах */ как о синтаксической ошибке.
Лучший способ временно убрать фрагмент изпрограммы — либо поместить // в начале каждой строки, либо вставить конструкцию if (false):if (false) {// Вызвать метод, когда он будет работатьdwim();}Разумеется, данный фрагмент предполагает, что метод dwim определен где-то в другом месте программы.5.3. ЛексемыЛексемами (tokens) языка называются “слова”, из которых состоит программа. Синтаксический анализатор разбивает исходный текст наотдельные лексемы и пытается понять, из каких операторов, идентификаторов и т. д. состоит программа. В языке Java символы-разделители(пробелы, табуляция, перевод строки и возврат курсора) применяются исключительно для разделения лексем или содержимого символьных илистроковых литералов. Вы можете взять любую работающую программу и заменить произвольное количество символов-разделителей междулексемами (то есть разделителей, не входящих в строки и символы) на другое количество разделителей (не равное нулю) — это никак неповлияет на работу программы.Разделители необходимы для отделения лексем друг от друга, которые бы в противном случае представляли бы собой одно целое.
Например, воператореreturn 0;нельзя убрать пробел между return и 0, поскольку это приведет к появлению неправильного оператораreturn0;состоящего всего из одного идентификатора return0. Дополнительные разделители облегчают чтение вашей программы, несмотря на то чтосинтаксический анализатор их игнорирует. Обратите внимание: комментарии считаются разделителями.Алгоритм деления программы на лексемы функционирует по принципу “чем больше, тем лучше”: он отводит для следующей лексемы как можнобольше символов, не заботясь о том, что при этом может произойти ошибка.
Следовательно, раз ++ оказывается длиннее, чем +, выражениеj = i+++++i; // НЕВЕРНОневерно интерпретируется какj = i++ ++ +i; // НЕВЕРНОвместо правильногоj = i++ + ++i;5.4. ИдентификаторыИдентификаторы Java, используемые для именования объявленных в программе величин (переменных и констант) и меток, должны начинатьсяс буквы, символа подчеркивания (_) или знака доллара ($), за которыми следуют буквы или цифры в произвольном порядке. Многимпрограммистам это покажется знакомым, но в связи с тем, что исходные тексты Java-программ пишутся в кодировке Unicode, понятие “буква” или“цифра” оказывается значительно более широким, чем в большинстве языков программирования.
“Буквы” в Java могут представлять собойсимволы из армянского, корейского, грузинского, индийского и практически любого алфавита, который используется в наше время.Следовательно, наряду с идентификатором kitty можно пользоваться идентификаторами maиka, кошка,,и. /Эти слова означают "кошка" или "котенок" на английском, сербо-хорватском, русском,фарси, тамильском и японском языках соответственно. Если в других языках они имеют иное значение, мы искренне надеемся, что оно неявляется оскорбительным; в противном случае приносим свои извинения и заверяем, что оскорбление было ненамеренным./ Термины “буква” и“цифра” в Unicode трактуются довольно широко, но если какой-либо символ считается буквой или цифрой в неком языке, то, по всейвероятности, он имеет аналогичный смысл и в Java.