Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Унарный плюс в Java

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

durov55



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет, дорогие камрады!
 
В который раз натыкаюсь на унарный оператор «плюс» и всё никак не могу понять его предназначение. Если с минусом всё сразу становится понятно (инвертирует значение выражения к которому он применяется, другими словами умножает значение операнда на -1), то с плюсом не всё так однозначно. В некоторых языках программирования его можно было бы перегрузить, но в Java перегрузка операторов не предусмотрена. По логике он просто возвращает на место операнда то же значение, что и было до этого (если операнд использует значение какой-то переменной, то просто возвращает это значение на место операнда, в случае же числового литерала, просто использует значение представленное литералом). Исходя из всего этого, не вижу никакого смысла в использовании этого оператора, его можно сравнить с некоторым архаизмом, пережитком прошлого или данью традициям...  
 
Но один вопрос всё же не даёт мне покоя. Буквально недавно наткнулся на следующую информацию. В документации по Visual Studio 2017 было указано, что оператор унарный «плюс» выполняет явное восходящее привидение целочисленных типов. Позволю себе привести небольшой пример:
У нас есть переменная сh типа char, если мы применим по отношению к этой переменной операцию унарного сложения, то есть, напишем +ch, то эта переменная будет приведена к примитивному типу int, при этом значение переменной, само собой разумеется, остаётся нетронутым. Так вот, меня интересует следующий вопрос: что если экстраполировать это на язык программирования Java? Будет ли работать восходящее приведение целочисленных типов в случае использования унарного «плюса» с примитивной переменной целочисленного типа?
 
Благодарен за ответ!)

Всего записей: 113 | Зарегистр. 06-02-2011 | Отправлено: 00:57 27-06-2017 | Исправлено: durov55, 01:02 27-06-2017
BioScum

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Интересный вопрос. По-моему это уже введено в Java.  
Суть в том, что операция унарного плюса имеет два типа. Это побочный эффект из мат.логики, однако для преобразования типов он используется даже в html.  
Формальная грамматика, используемая при построении компилятора от унарного плюса не усложняется. Так как при хранении чисел он ничего не сделает.  То есть вполне возможно, что данный вопрос решается от компилятора к компилятору.

Всего записей: 4 | Зарегистр. 02-07-2017 | Отправлено: 13:50 05-07-2017
durov55



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BioScum
Приветствую! Немного разобрался с этим вопросом и методом проб и ошибок пришёл к выводу, что любая арифметическая операция в Java, включая вышеупомянутый унарный «плюс», приводит к неявному восходящему преобразованию любого целочисленного типа (кроме long конечно же, так как этот тип стоит на уровень выше в иерархии типов, чем int) до int. То бишь, итоговое значение, полученное в результате преобразований из правой части выражения, будет преобразовано к целочисленному типу int. Даже если изначально мы имели в правой части значения типа byte, short и даже char (также относится к целочисленным типам, так как любой символ Unicode в доступном диапазоне типа char можно представить в виде целого числа), все они будут преобразованы к int.  
 
Ради интереса, написал такой вот простенький код для проверки:
 

Код:
public class Main {
   
    public static void main(String[] args) {
       
    byte b = 2;
    short sh = 3;
    char c = 'c';
     
    UnaryPlus up = new UnaryPlus();
      up.unaryMethod(b);
      up.unaryMethod(sh);
      up.unaryMethod(c);
      up.unaryMethod(+b);
      up.unaryMethod(+sh);
      up.unaryMethod(+c);
   
    }
   
}
 
 
class UnaryPlus {
   
  public void unaryMethod(byte b) {
      System.out.println("Byte: "+b);
  }
   
  public void unaryMethod(short sh) {
      System.out.println("Short: "+sh);
  }
   
  public void unaryMethod(char c) {
      System.out.println("Char: "+c);
  }
   
  public void unaryMethod(int i) {
      System.out.println("Int: "+i);
  }
   
}
 
/* Output:
* Byte: 2
* Short: 3
* Char: c
* Int: 2
* Int: 3
* Int: 99
*///:~

Всего записей: 113 | Зарегистр. 06-02-2011 | Отправлено: 13:15 11-07-2017 | Исправлено: durov55, 13:19 11-07-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А будут ли эти преобразования при сложении двух переменных типа байт и записи результата в переменную типа байт?

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:36 12-07-2017
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А будут ли эти преобразования при сложении двух переменных типа байт и записи результата в переменную типа байт?

Dronton2, да. В стандарте всё описано:#15.18 #5.6.2

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 12:14 12-07-2017 | Исправлено: NeoAnomaly, 12:33 12-07-2017
durov55



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2
Совершенно верно, преобразования будут. Если мы попытаемся поместить результат сложения двух переменных типа byte в переменную того же типа, то при попытке компиляции кода получим следующую ошибку:  
 

Код:
error: incompatible types: possible lossy conversion from int to byte

 
Как видно из сообщения об ошибке, компилятор ругается на то, что мы пытаемся поместить значение типа int в именующее выражение типа byte. Следовательно, можно прийти к выводу, что в результате преобразований над выражением, содержащим арифметическую операцию сложения, произошло восходящее преобразование результирующего значения до типа int.  
 
Решил немного преобразовать свой предыдущий пример для наглядности, экстраполируя его на Вашу ситуацию:  
 

Код:
public class Main {  
   
    public static void main(String[] args) {  
       
    byte b = 2;  
    short sh = 3;  
    char c = 'c';  
     
    UnaryPlus up = new UnaryPlus();  
      up.unaryMethod(b);  
      up.unaryMethod(sh);  
      up.unaryMethod(c);  
      up.unaryMethod((b+b));  
      up.unaryMethod((sh+sh));  
      up.unaryMethod((c+c));  
     
    }  
   
}  
 
 
class UnaryPlus {  
   
  public void unaryMethod(byte b) {  
      System.out.println("Byte: "+b);  
  }  
   
  public void unaryMethod(short sh) {  
      System.out.println("Short: "+sh);  
  }  
   
  public void unaryMethod(char c) {  
      System.out.println("Char: "+c);  
  }  
   
  public void unaryMethod(int i) {  
      System.out.println("Int: "+i);  
  }  
     
}  
 
/* Output:  
* Byte: 2
* Short: 3
* Char: c
* Int: 4
* Int: 6
* Int: 198
*///:~

Всего записей: 113 | Зарегистр. 06-02-2011 | Отправлено: 15:18 12-07-2017
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Унарный плюс в Java


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru