Введите в файл LogicalOpTable . j ava исходный код программы, как показано ниже. // Пример для опробования 2.2. // Отображение таблицы истинности для логических операторов, class LogicalOpTable { public static void main(String args[]) { boolean p, q; System.out.println(MP\tQ\tAND\tOR\tXOR\tNOT"); p = true; q = true; System.out.print(p + "\tM + q +"\tn); System.out.print((p&q) + "\t" + (plq) + "\t"); System.out.println((pAq) + "\t" + (Ip)); p = true; q = false; System.out.print(p + "\t" + q +"\t"); System.out.print((p&q) + "\t" + (plq) + "\t"); System.out.println((pAq) + "\t" + (!p)); p = false; q = true; System, out .print (p + n\t" + q +"\t,f); System.out.print((p&q) + "\t" + (plq) + "\t"); System.out.println((pAq) + M\t" + (!p)); p = false; q = false; System.out.print(p + "\t" + q +"\t"); System.out.print((p&q) + "\t" + (plq) + "\t"); System.out.println((pAq) + "\t" + (!p)); } }
Обратите внимание на то, что в операторах с вызовами метода println логические операторы заключены в круглые скобки. Эти скобки необходимы для соблюдения предшествования операторов. В частности, арифметический оператор + имеет более высокий порядок предшествования, чем логические операторы.
Скомпилируйте программу и запустите ее на выполнение, чтобы вывести на экран следующий результат:P Q AND OR XOR NOT true true true true false false true false false true true false false true false true true true false false false false false true
Попробуйте видоизменить программу таким образом, чтобы вместо логических значений true и false отображались значения 1 и 0. Это потребует больших усилий, чем кажется на первый взгляд! Выражения
Операторы, переменные и литералы являются составными частями выражений. Выражением в Java может стать любое допустимое сочетание этих составных частей. Выражения должны быть уже знакомы вам по предыдущим примерам программ. Более того, вы изучали их в школьном курсе алгебры. Но некоторые их особенности все же нуждаются в обсуждении. Преобразование типов в выражениях типов в выражениях
В выражении можно свободно употреблять два или несколько типов данных, при условии их совместимости друг с другом. Например, в одном выражении допускается применение типов short и long, поскольку оба типа являются числовыми. Когда в выражении употребляются разные типы данных, они преобразуются в один и тот же тип по принятым в Java правилам продвижения типов.
Сначала все значения типа char, byte и short продвигаются к типу int. Затем все выражение продвигается к типу long, если хотя бы один из его операндов принадлежит к типу long. Далее все выражение продвигается к типу float, если хотя бы один из операндов относится к типу float. А если какой-нибудь из операндов относится к типу double, то результат также относится к типу double.
Очень важно иметь в виду, что правила продвижения типов применяются только к значениям, над которыми выполняются действия по мере вычисления выражения. Так, если значение переменной типа byte при вычислении выражения продвигается к типу int, за пределами выражения эта переменная будет по-прежнему относиться к типу byte. Следовательно, продвижение типов затрагивает только вычисление выражения.
Но продвижение типов может иногда привести к неожиданным результатам. Если, например, в арифметической операции используются два значения типа byte, то про исходит следующее. Сначала операнды типа byte продвигаются к типу int. А затем выполняется операция, дающая результат типа int. Следовательно, результат выполнения операции, в которой участвуют два значения типа byte, будет иметь тип int. Но ведь это не тот результат, который можно было бы с очевидностью предположить. Рассмотрим следующий пример программы: // Неожиданный результат продвижения типов! class PromDemo { public static void main(String args[]) { byte b; int i; b = 10; // В данном случае приведение типов не требуется, так как // результат вычисления выражения уже относится к типу int. i = b * b; b = 10; // А в этом случае приведение типов требуется для // присваивания значения int переменной типа byte! b = (byte) (b * Ь); // cast needed!! System.out.println("i and b: " + i + " " + b); } }