Я читаю учебник по Java и наткнулся на этот отрывок. У меня возникли вопросы.

Во-первых, вот несколько специальных экранированных персонажей, о которых упоминается в книге.

’\n’ the newline character 
’\t’ the tab character
’\0’ the zero character
’\’’ the single-quote character 
’\"’ the double-quote character 
’\\’ the backslash character

Пока проблем нет. Потом пишет:

Символы новой строки и табуляции часто используются при построении строк, которые будут напечатаны. Например, можно написать

System.out.println ("Here’s a person:\t" + name + ’\t’ + age + "\n\n");

Но потом пишет:

Было бы лучше и безопаснее использовать "\ t" вместо ’\ t’ в строке выше. Если вы написали

System.out.println (age + ’\t’ + name);

символы возраста и табуляции будут добавлены как целые числа, что, вероятно, не то, что планировал программист. Письмо

System.out.println (age + "\t" + name);

заставит оба использования оператора плюса интерпретироваться как конкатенации.

Почему плохое использование одинарных кавычек вокруг символа табуляции? Я не понимаю, в чем проблема и почему это происходит? Почему '\ t' внезапно интерпретируется интерпретатором Java как int?

0
Jwan622 29 Дек 2015 в 03:50

5 ответов

Лучший ответ

+ работает по-разному в зависимости от того, является ли один из его аргументов String или нет. Если один аргумент - это String, то другой аргумент преобразуется в String, а + выполняет конкатенацию строк. Но если ни один из аргументов не является String, тогда оба аргумента должны быть числами, и результатом будет арифметическое сложение. char - числовой тип ('\t' имеет значение 9).

Путаница возникает, когда несколько операндов связаны вместе с +. Рассмотрим это, где int1 и int2 - целочисленные переменные:

"String" + int1 + '\t' + int2
int1 + " String" + '\t' + int2
int1 + '\t' + "String" + int2
int1 + '\t' + int2 + "String"

+ ассоциируется слева направо. В первом выражении программа сначала вычисляет "String" + int1, что означает, что она преобразует целое число в String, а результатом является строка (назовите ее temp1). Затем он вычисляет temp1 + '\t', а поскольку temp1 является String, он преобразует '\t' в строку (строку из одного символа табуляции) и объединяет. Результатом является другая строка (назовите ее temp2), а затем последний + преобразует int2 в String и объединит с ним temp2.

Второе выражение работает аналогично, поскольку крайний левый + имеет один строковый операнд. Это означает, что все + будут операторами конкатенации строк.

А вот третье выражение другое. Крайний левый + складывает два целых числа (на самом деле int и char), поэтому результат будет результатом int1 + 9, целого числа. Затем, поскольку следующий + имеет операнд String, это целое число (int1 + 9) будет преобразовано в строку и объединено. Это приводит к String, поэтому последний + также является конкатенацией строк, а int2 преобразуется в строку.

В последнем случае первое и второе + являются целочисленным сложением. В результате вычисляется int1 + int2 + 9; затем результат преобразуется в строку и объединяется со строковым литералом.

Я думаю, это то, о чем я думаю. Хотя первый пример будет работать, он чреват случайностью, потому что, если вы решите повторить выражение и удалить первый строковый литерал, значения всех операторов + внезапно изменится на арифметическое сложение.

Обратите внимание, что это применимо только к оператору +. Это единственный оператор, у которого есть это специальное свойство перегрузки.

2
ajb 29 Дек 2015 в 01:18

Escape-последовательность, если она записана в '' (одинарные кавычки), действует как символ. И каждый символ имеет соответствующее значение ASCII, которое является int. Итак, когда вы пишете System.out.println (age + ’\ t’ + name); он суммирует возраст и значение ASCII '\ t'. Тогда как, когда вы пишете \ t в "" (двойные кавычки), он принимает это как строку, но все же может интерпретировать ее как escape-последовательность.

Надеюсь, это поможет!

0
Swapnil Kamat 29 Дек 2015 в 01:02

Проблема не во вкладке. Проблема в окружающих типах.

'\t' обозначает символ t, а "\t" - это строка длиной один.

Проблема, на которую они указывают, - это окружающий типаж. Добавление целого числа к строке дает конкатенированную строку. Добавление целого числа к символу дает целое число.

2
David Maust 29 Дек 2015 в 00:56

Когда вы используете System.out.println ("Here’s a person:\t" + name + ’\t’ + age + "\n\n");, он сообщает вам Было бы лучше и безопаснее использовать "\ t" вместо '\ t' в строке выше. Причина is "Here’s a person:\t" - это строковый тип, а ’\t’ - символьный. И opSerator '+' хорошо работает в строковом режиме, но не в строковом символе.

Когда вы используете System.out.println (age + ’\t’ + name); '+' работает с int-and-int (как вы знаете, символ может быть преобразован в тип int).

когда вы используете System.out.println (age + "\t" + name); '+' работает как оператор соединения строки.

1
J.Maxg 29 Дек 2015 в 01:10

Все, что находится внутри одинарных кавычек, указывает на char, и когда вы добавляете char в int, результат также будет int. Тогда как когда вы используете оператор + с любой строкой, это означает, что вы объединяете.

0
Mandeep Rajpal 29 Дек 2015 в 01:09