2010-04-12 3 views
29

Унарный оператор Java Java, похоже, перешел от C через C++.Какова цель унарного оператора Java Java?

int result = +1; 

Это, как представляется, имеют следующие эффекты:

  • Unboxes операнда, если это объект оболочки
  • Содействует свой операнд int, если это не уже int или шире
  • Усложняет незначительное разглашение злых выражений, содержащих большое количество последовательных знаков плюс

Мне кажется, что есть лучшие/более четкие способы сделать все это.

В документе this SO question, касающемся оператора-оператора в C#, кто-то сказал, что «это должно быть перегружено, если вы считаете нужным».

Однако на Java невозможно перегрузить любого оператора. Таким образом, этот оператор унарного плюса существует в Java только потому, что он существовал на C++?

+4

запутывания кода конкурсы ... экзамена SCJP ... – Pops

+0

Аналогичный вопрос для C, который не имеет перегрузки либо: http://stackoverflow.com/questions/6637005/what-is-the-the-of-the-unary-operator-in-c, и аналогично Java делает продвижение по типу. –

ответ

32

Унарный оператор плюс выполняет автоматическое преобразование int когда тип операнда является byte, char или short. Это называется унарным числовым расширением, и это позволяет делать такие вещи, как следующее:

char c = 'c'; 
int i = +c; 

Конечно, это ограниченное применение. Но у него есть цель. См. Спецификации, в частности разделы §15.15.3 и §5.6.1.

+14

Правильно, но в этом случае он лишний. Поскольку это расширенное преобразование, 'int i = c;' будет делать то же самое. – Syntactic

+4

Это не обязательно избыточно в целостном смысле, потому что оно передает намерение. Можно было бы задаться вопросом о «int i = c'», «разрешил ли автор этого кода присваивать' c' 'int'? Есть ли другие способы сделать это? Конечно, но это самый короткий путь, который также передает намерение. –

+5

Хороший вопрос. Я думаю, что на практике я с большей вероятностью буду делать «int i = (int) c;», если я хотел передать намерение, но использование '+', конечно, короче. – Syntactic

6

Я не знаю, но я подозреваю, что он существует для симметрии с (очевидно необходимым) унарным оператором минус.

+8

Вполне возможно, что если бы на Java не было унарного оператора с плюсом, я бы сидел здесь на Stack Overflow, жалуясь на это ... – Syntactic

+0

Это то, что я всегда предполагал ... –

2

Я предполагаю, что это так, потому что иногда набирать плюсы делает вещи более ясными. Вы можете подчеркнуть тот факт, что некоторое число положительно, а не какое-то отрицательное число.

Кроме того, чтобы обеспечить пример реального мира, где он используется, положительные температуры всегда имеют префикс с плюсом в некоторых частях мира.

+9

Если x отрицательно, '+ x' тоже отрицательный ... – assylias

2

Одна из целей дизайна Java была знакома (разработчику C/C++), поэтому, когда дело касается таких операторов, я уверен, что у них будет сильная причина, чтобы исключить ее, а не хороший причина в этом нуждается.

2

Многие другие языки имеют унарный плюс. Обычно принято включать его, и пенни-щипать, чтобы исключить его. Это всего лишь пара строк в компиляторе.

6

Вот короткая демонстрация того, что унарный плюс будет делать с переменной Характер:

private static void method(int i){ 
    System.out.println("int: " + i); 
} 

private static void method(char c){ 
    System.out.println("char: " + c); 
} 

public static void main(String[] args) { 
    Character ch = 'X'; 
    method(ch); 
    method(+ch);   
} 

Выход запуска этой программы:

char: X 
int: 88 

Как это работает: Одинарный + или - распакуйте их операнд, если это объект-оболочка, затем продвигайте их операнд к int, если он уже не является int или более широким. Итак, как мы видим, в то время как первый звонок на method выберет перегрузку char (только для распаковки), второй вызов выберет int вариант method. Переменная ch типа Character будет передана в method как int аргумент из-за применяемого унарный плюс.

1

Унарные операторы выполните следующие действия для Java:

  • "+" Одинарный оператор плюс; указывает положительное значение (номера положительные без этого, однако)
  • «-« Унарный минус-оператор; отрицает выражение
  • ++ Оператор приращения; увеличивает значение на 1
  • - Оператор уменьшения; уменьшает значение на 1 ! Оператор логического дополнения; инвертирует значение булевой

Источник: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html

Смежные вопросы