J_Лекция 2 Арифметические операторы .ppt
- Количество слайдов: 20
Арифметические операторы № 2
1 Арифметические операторы Unary ++ -- + - ! ~ ( ) Arithmetic + * / % Sift << >> >>> Comparison < < = > > = Instanceof = = ! = Bitwise & ^ | Shortcircuit && || Ternary ? : assignment = - ‘op=’
2. Порядок выполнения операций Операции выполняются слева - направо int[]a={4, 4}; int b=1; a[b]=b=0; //a[1]=0;
3. Унарные операции ++ -Начальное значение Выражение Конечное значение Y значение X 5 5 Y=X++ Y=++X 5 6 6 6 5 Y=X-- 5 4 5 Y=--X 4 4
4 Логические выражения public Object my. Method(Object x){ if(x instanceof String) {// do nothing}; else {x=x. to. String(); } return x; } //---------------public Object my. Method(Object x){ if(!(x instanceof String)) {x=x. to. String(); return x; }
5. Оператор приведения (type) Предназначен для явного приведения типа выражения: int circum=(int)(Math. PI*diameter); Оператор может быть применен к объекту, например преобразование строки в вектор: Vector v=new Vector(); v. add. Element(“Hello”); String s=(String)v. element. At(0); element. At() возвращает элементарный объект.
6 Арифметические операторы Операторы * и / применяют для всех числовых типов. При делении на нуль операции * и / для целых типов и char выбрасывают Arithmetic. Exception. int a=12345, b=234567, c, d; long e, f; c=a*b/b; //-5965 d=a/b*b; //0 System. out. println(‘c=’+c+’d=’+d); e=(long)a*b/b; //12345 f=(long)a/b*b; //0 System. out. println(‘e=’+e+’f=’+f);
7 Оператор % o Остаток от деления. Алгоритм вычисления результата Arithmetic. exception - если возникает деление на нуль. 17%5=2 -5%2=-1 7. 6%2. 9=1. 8 17 -5=12 -5 -(-2)=-3 7. 6 -2. 9=4. 7 12 -5=7 -3 -(-2)=-1 4. 7 -2. 9=1. 8 7 -5=2 |-1|<2 1. 8<2. 9 2<5
8. Операторы + o o Оператор + перегружен на уровне языка Java. Выполняет объединение строк. Метод to. String() определен в java. lang. Object и переопределен в классах Integer, Float, Double: Integer. to. String(); Если один из операндов типа String, то второй преобразуется к этому типу.
9. Арифметические ошибки o o o При целом делении на нуль возникает Arithmetic. Exception. Переполнение при целых операциях может привести к неправильному знаку. Out of range для числа с плавающей точкой (положительная и отрицательная бесконечность) или нечисловые данных Na. N, например, при вычислении корне из отрицательного числа. Сравнение с нечисловыми данными Na. N определен в java. lang пакете: Float. Na. N, Double. Na. N
10. Сравнения нечисловых данных o o o Для сравнения нечисловых данных используйте методы: Float. is. Na. N(float) Double. is. Na. N(double) X < Float. Na. N false X < Double. Na. N false X <= Float. Na. N false X <= Double. Na. N false X == Float. Na. N false X == Double. Na. N false X > Float. Na. N false X > Double. Na. N false X >= Float. Na. N False X >= Double. Na. N false Float. Na. N!=Float. Na. N true Double. Na. N!=Double. Na. N true Float. Na. N==Float. Na. N false Double. Na. N==Double. Na. N false
11. Три сдвиговых оператора: >> << >>> Original data: X=192 00000000 11000000 Shift left 1 bit 0 000000001 1000000? Shift right 1 bit ? 00000000 01100000 0 Shift left 4 bit 000000001100 0000? ? Original data: X=-192 11111111 01000000 Shift left 1 bit 1 111111110 1000000? Shift right 1 bit ? 11111111 10100000 0 Shift left 4 bit 111111110100 0000? ?
12. Три сдвиговых оператора: >>, <<, >>> Original data: X=192 00000000 11000000 X<<1 000000001 10000000 X>>1 00000000 01100000 X>>>1 00000000 01100000 Original data: X=-192 11111111 01000000 X<<1 111111110 10000000 X>>1 11111111 10100000 X>>>1 011111111 10100000
13. Три сдвиговых оператора: >> o o o o << >>> В операциях << знакового левого сдвига новые биты заполняются нулями В операциях >> знакового правого сдвига новые биты заполняются битом знака В операциях >>> беззнакового правого сдвига новые биты заполняются нулями Сдвиг влево << умножает число на 2, 4, 8, … Сдвиг вправо >> делит число на 2, 4, 8, … 1>>1=0 эквивалентно 1/2 -1>>1=-1; Сдвиг вправо >>> беззнакового числа не имеет арифметического значения. Язык Java не имеет беззнаковых чисел кроме char, поэтому оператор нужен.
14. Снижение правого оператора сдвига o o Java сокращает величину сдвига. Число сдвигов уменьшается на величину разрядности числа. Пусть число имеет 32 разряда. Сдвиг на 33 разряда соответствует сдвигу на 33%32=1 разряд.
15. Арифметическое обеспечение операторов сдвига Все числовые операторы при сдвиге преобразуются к типу int. Байтовое число -64 byte X 11000000 int X=-64 11111111 11000000 Y=X>>4 11111111 11111100 byte Y 11111100 Ожидаем Y 00001100
16. Операторы сравнения < <= >= > int i=9; float f=9. 0 F; int q=65; char c=’A’; int r=-12 При сравнении меньший тип преобразуется к большему типу i
17. Побитовые операторы &, ^, | byte a=7, b=3; int c=a & b; System. out. println("a&b="+c); c=a ^ b; System. out. println("a^b="+c); c=a | b; System. out. println("a|b="+c); 00000111 & 00000011 = 00000011 a&b=3 00000111 ^ 00000011 = 00000100 a^b=4 00000111 | 00000011 = 00000111 a|b=7
18. Тернарный оператор : ? if(x) a=b; else a=c; a=x? b: c; 1. Типы выражений b и c должны быть сопоставимы. 2. Тип выражения x должен быть boolean. 3. Типы b и c должны быть преобразуемыми к типу а. 4. Величинаа равна b если x = true или равно c если x = false. Можно использовать сложные тернарные операторы a=b ? c ? d : f : g; b=true, c=true, a=d; b=true, c=false, a=f; b=false, c=true, a=g; b=false, c=false, a=g; a = b ? c ? d : f : g; if(b) { if(c) a=d; else a=f; } else a=g;
19. Выводы Группу унарных операторов составляют ++, --, +, -, !, ~, (type). o n n n o o Унарные операторы ++ и -- выполняют увеличение или уменьшение значений операнда, оператор – меняет знак переменной, оператор ~ выполняет битовую инверсию операнда целого типа, оператор ! выполняет инверсию логического операнда, оператор приведения (type) указывает компилятору на необходимость преобразования типа операнда. Арифметические операторы применяются к числовым данным. Во время вычисления могут возникать ошибки. При делении на нуль целых чисел возбуждается исключение. При делении на нуль чисел с плавающей точкой результатом может быть Na. N или INFINITY. Оператор + применяется также для конкатенации строк. Операторы сдвига влево << и вправо >> учитывают знак операнда. Оператор сдвига >>> является беззнаковым. Побитовые операторы &, ^, | представляют операторы AND, XOR и OR примененные к каждому биту данных. Тернарные операторы позволяют записывать в одной строке довольно сложные условные операторы.