При изучении в java цикла for написала простой цикл, который должен выводить все четные числа до 100 и оставлять между ними строку. Я нашла в итоге ответ, что надо было ставить двойные кавычки, вместо одинарных и то, что я задумала, у меня в итоге получилось. Но я так и не поняла, что происходит в этом случае:
for(int i = 2; i <= 100; i=i+2)<br>
System.out.println(i+'\n');
Я прочитала, что тут происходит конкатенация, но совершенно не могу понять что с чем, если в ответе:
12
14
16
18
20
etc
Почему возвращаются цифры с 12?
Строковые литералы (константы типа String) заключаются в двойные кавычки:
String s = "a"; //это строка
Оператор + в котором участвует строка и другой объект/примитивное значение приводят к конкатенации:
String newString = 1+"a"; //1a
Символьные литералы (константы типа char) заключаются в одинарные кавычки:
char ch = 'a';
Тип char, в отличие от String — целочисленный тип (JLS §4.2.1) это означает, что каждый символ представляет собой числовое значение символа в кодировке UTF-16. Как следствие, char можно привести к числу:
System.out.println((int) 'a'); //97
System.out.println((int) '\n'); //10
Оператор + для char также работает по-другому, при сложении (i+'\n') конкатенации не происходит, просто прибавляется числовое значение символа \n, а именно 10
Поведение оператора + описывается в спецификации Java (§15.18 Additive Operators):
If the type of either operand of a + operator is String, then the operation is string concatenation.
Otherwise, the type of each of the operands of the + operator must be a type that is convertible (§5.1.8) to a primitive numeric type, or a compile-time error occurs.
Если один из операндов имеет тип String, то операция представляет собой конкатенацию строк.
В противном случае тип каждого операнда оператора + должен быть преобразуемым (§5.1.8) в примитивный числовой тип, иначе генерируется ошибка времени компиляции.
При выполнении операции сложения оба операнда должны быть int, и результат тоже получается int, после его получения значение преобразуется в String (здесь ссылка на print), потом печатается на экран.
Операция конкатенации выполняется если один из операндов имеет тип String.
Вот здесь правильный перевод документации JLS-15.18(спасибо Гугл):
Если тип любого из операндов оператора + - String, то операция - конкатенация строк.
В противном случае тип каждого из операндов оператора + должен быть типом, который можно преобразовать (§5.1.8) в примитивный числовой тип, иначе произойдет ошибка времени компиляции.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей