Что делает Java с длинными переменными при выполнении сложения?
Неправильная версия 1:
Vector speeds = ... //whatever, speeds.size() returns 2
long estimated = 1l;
long time = speeds.size() + estimated; // time = 21; string concatenation??
Неправильная версия 2:
Vector speeds = ... //whatever, speeds.size() returns 2
long estimated = 1l;
long time = estimated + speeds.size(); // time = 12; string concatenation??
Правильная версия:
Vector speeds = ... //whatever, speeds.size() returns 2
long estimated = 1l;
long size = speeds.size();
long time = size + estimated; // time = 3; correct
Я не понимаю, почему Java объединяет их.
Кто-нибудь может мне помочь, почему две примитивные переменные объединены?
Привет, Герда
Вы приняли ответ, но он не полностью объясняет причину проблемы - не могли бы вы уточнить ??




Я подозреваю, что вы видите не то, что думаете. Java этого не делает.
Пожалуйста, попробуйте предоставить короткая, но полная программа, который демонстрирует это. Вот короткая, но полная программа, которая демонстрирует правильное поведение, но с вашим «неправильным» кодом (т. Е. Контрпримером).
import java.util.*;
public class Test
{
public static void main(String[] args)
{
Vector speeds = new Vector();
speeds.add("x");
speeds.add("y");
long estimated = 1l;
long time = speeds.size() + estimated;
System.out.println(time); // Prints out 3
}
}
Так что же было правильным в этом ответе? Что автор делал не так?
Я предполагаю, что вы на самом деле делаете что-то вроде:
System.out.println("" + size + estimated);
Это выражение вычисляется слева направо:
"" + size <--- string concatenation, so if size is 3, will produce "3"
"3" + estimated <--- string concatenation, so if estimated is 2, will produce "32"
Чтобы это сработало, вам следует сделать:
System.out.println("" + (size + estimated));
Опять же, это оценивается слева направо:
"" + (expression) <-- string concatenation - need to evaluate expression first
(3 + 2) <-- 5
Hence:
"" + 5 <-- string concatenation - will produce "5"
Совет: не используйте «l» для длинных букв, так как в некоторых шрифтах она неотличима от «1». Вместо этого используйте "L".