У меня естьРазница между одинарными кавычками и двойными кавычками в java?
System.out.println(2+" "+3);
System.out.println(2+' '+3);
Первый из них оттисков 2 3, а вторая печать 37 Может ли ребята объяснить, почему он печатает 37 ???
У меня естьРазница между одинарными кавычками и двойными кавычками в java?
System.out.println(2+" "+3);
System.out.println(2+' '+3);
Первый из них оттисков 2 3, а вторая печать 37 Может ли ребята объяснить, почему он печатает 37 ???
Первый преобразует все в строку для вас. Второй - преобразование в целое. Десятичный код для пробела равен 32. Если вы хотите, чтобы 2 и 3 были строкой, используйте кавычки.
' '= 32
в ascii.
a:) System.out.println(2+" "+3); // string concatenation
b:) System.out.println(2+' '+3); // 2+ 32(32 ascii valur for space)+3 so 37
Это потому, что вы печатаете целые значения 2+ ' ' +3
и переведет ' '
его как char
а не string
, который просто преобразует б) частично это значения ASCII, которые приводят к 2 + ASCII value of Space + 3
и конечный результат будет be 37, поскольку значение ASCII для space
равно 32.
Первый пример - выполнение конкатенации строк, поэтому ответ довольно интуитивно понятен. Второй пример отличается от того, что '' не является строкой, это символ. Символ преобразуется в целочисленный код, поэтому вы получаете это число.
Цитирование Спецификация языка Java для Additive Operators:
Если тип либо операнда
+
оператораString
, то операция конкатенации.В противном случае, тип каждого из операндов оператора
+
должен быть типом, который является обратимым (§5.1.8) до примитивного числового типа
Binary числовое расширение выполняется над операндами (§5.6.2)
[...] В противном случае оба операнда преобразуются в тип
int
.
Так, 2+" "+3
является 2 + " "
, который является конкатенация, и String + 3
также конкатенация, следовательно 2 + " " + 3
является "2" + " " + "3"
, что означает "2 3"
.
2+' '+3
является 2 + ' '
, а пространство буквальным является char
, поэтому он преобразуется в int
(32), и это 2 + 32 + 3
37
.
Если литералы были переменными, это было бы на самом деле быть таким, где присваивание переменным используются только для иллюстрации типа промежуточного результата:
// String concatenation
String s = new StringBuilder().append(2).append(" ").append(3).toString();
System.out.println(s);
// Numeric addition
int n = 2 + (int)' ' + 3;
System.out.println(n);
Оба append()
и println()
перегружены, поэтому они не все одинаковы.
Поскольку они являются константами, а не переменные, компилятор сделает это во время компиляции, и вы действительно получите это (попробуйте разборке .class файл, чтобы увидеть для себя):
System.out.println("2 3");
System.out.println(37);
Concatenation как вот почти одна ситуация, когда Java настолько терпима. В другом контексте с char '' и String "" показывает true: существуют разные типы.
Если выходной аргумент для System.out.println
явно равен java.lang.String
, java автоматически преобразует любые типы данных и объекты, которые он задает в качестве выходных аргументов, в java.lang.String
.
В первом примере, System.out.println(2+" "+3);
, что Java делает это сканирование через выходные аргументы и находит int
(2), двойные кавычки " "
, который указывает на массив символов в двойных кавычках должны интерпретироваться как String
и другой int
(3). Java принимает строку String " "
как подсказку о том, что все остальное в аргументе следует рассматривать как строки. Так что фактически происходит в том, что линия System.out.println(2+" "+3);
рассматривается, как если бы вы написали
System.out.println(Integer.toString(2)+" "+Integer.toString(3));
В вашем втором примере System.out.println(2+' '+3);
происходит тот же процесс, но вместо того, чтобы найти двойные кавычки, ява находит ' '
- пробела в окружении по одной кавычки, которая сообщает java, что она работает с примитивным типом данных char
- и вот почему java рассматривает это как операцию добавления: all java primitive data types are numbers - поэтому java принимает этот намек и интерпретирует выходные аргументы как int
(2), оператор сложения (+), a char
(символ пробела) - то же самое, что и без знака short
, дополнение оператора (+) и другого int
(3). Числовое значение символа 32, так что за преобразованием сцены обрабатывает ваше заявление, как вы написали
System.out.println(Integer.toString(2+32+3));
Конечно, синтаксическая, что происходит за кулисами еще более сложный, чем я мог бы описать для ты здесь. Почему бы вам не попробовать:
System.out.println("The answer is "+(3+" "+2));
System.out.println("The answer is "+(3+2));
System.out.println("The answer is "+(3+' '+2));
или даже
System.out.println('a' + 'b' + 'c');
На самом деле первым println является 'System.out.println (new StringBuilder(). Append (2) .append (" ") .append (3) .toString()) ;, а второй -' System.out. println (2 + (int) '' + 3); ', хотя на самом деле компилятор сделает это во время компиляции. – Andreas
«все примитивные типы данных java - это числа», за исключением булевых. – Andreas
@ Andreas, ну тогда молитесь, почему бы вам не объяснить для класса, как JVM DOES лечит логическое? – user5292387
Используя одиночные кавычки для символов и двойные кавычки для строк. Когда вы добавляете символ, это число. Когда вы добавляете строку, она добавляет строку. –
char и int - разные представления по значению. –