Почему Integer.parseInt ("1") ++ не работает в Java? - PullRequest
23 голосов
/ 16 декабря 2011

У меня есть следующая строка кода:

suffix = suffix.isEmpty() ? "1" : Integer.toString(Integer.parseInt(suffix)+1);

в блоке, где суффикс уже объявлен как пустая строка (""). Блок ищет дубликаты имен файлов и добавляет номера к любым дубликатам, чтобы они больше не имели одно и то же имя.

Строка кода выше компилируется нормально, но если я изменю это на

suffix = suffix.isEmpty() ? "1" : Integer.toString(Integer.parseInt(suffix)++);

Я получаю Invalid argument to operation ++/--. Так как Integer.parseInt() возвращает и int, почему я не могу использовать оператор ++?

Ответы [ 5 ]

50 голосов
/ 16 декабря 2011

Оператор ++ должен обновить значение своего аргумента, поэтому аргумент должен иметь фиксированную позицию в памяти для обновления.По этой причине аргумент должен быть переменной *.В этом случае аргумент - Integer.parseInt(suffix), не имеет фиксированного адреса памяти, который нужно вообще обновлять.

Интуитивно, Integer.parseInt(suffix)++ примерно эквивалентен Integer.parseInt(suffix) = Integer.parseInt(suffix) + 1.Но Integer.parseInt(suffix) - это просто целочисленное значение, не связанное с фиксированной позицией в памяти, поэтому приведенный выше код - это почти то же самое, скажем, 32 = 32 + 1.Поскольку вы не можете присвоить новое значение 32 (ни Integer.parseInt(suffix)), то нет смысла поддерживать оператор ++.

Хорошая новость заключается в том, что это вообще не вызывает никаких проблем!Вместо Integer.parseInt(suffix)++ напишите Integer.parseInt(suffix)+1.

* Или, как его обычно называют, l-значение или адресное значение .

13 голосов
/ 16 декабря 2011

++ требует lvalue (присваиваемое значение).

Integer.parseInt(suffix) не является lvalue.

Обратите внимание, что i++ отличается от i+1.

10 голосов
/ 16 декабря 2011

Написание i ++ является ярлыком для i = i + 1;если бы вы «читали по-английски», вы бы прочли это как «я становлюсь текущим значением i плюс один»

, поэтому 3 ++ не имеет смысла, вы не можете сказать 3= 3 + 1 (читается как 3 становится текущим значением 3 плюс один) :-)

10 голосов
/ 16 декабря 2011

int является значением.Поскольку он не привязан к переменной, вы не можете использовать постинкремент.

8 голосов
/ 16 декабря 2011

++ ожидает присваиваемого значения, то есть переменной.Integer.parseInt возвращает значение, которое нельзя присвоить.Если вам нужно значение плюс один, используйте Integer.parseInt(suffix)+1.

...