Может кто-то, пожалуйста, помогите мне с этим кодом манипуляции Java. Я хочу знать, как последние две распечатки составляют соответственно 35, а не 8? [Дубликат]

один простой способ произвести эту ошибку - старый сервер с register_globals = On. то вам понадобятся только две строки кода:

<?php
    $_SESSION["my_var"] = "string";
    $my_var = new MyClass(); //could be any class, i guess
?>

, как только вы перезагрузите эту страницу один раз, вы получите ошибку Exception thrown without a stack frame in Unknown on line 0. похоже, что существует конфликт между экземпляром класса и переменной (session). по крайней мере, так я получил эту досадную ошибку, которую так сложно отлаживать.

1
задан Nirmal 10 April 2015 в 03:18
поделиться

4 ответа

Я думаю, что спецификация Java объясняет это лучше всего:

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

a + b + c

всегда рассматривается как означающее:

(a + b) + c

Итак, если a был String, он объединяется с b. Результат будет иметь тип String, поэтому он продолжает конкатенацию с c.

3
ответ дан Vineet 22 August 2018 в 18:20
поделиться
  • 1
    это имеет смысл, но все же озадачивает, когда вы смотрите на что-то вроде: byte b =10; b = b+10;//gives type mismatch error, но нет ошибки, когда вы делаете byte c = 10; c+=10; //no error here(implicit typecasting)? – Nirmal 10 April 2015 в 03:30
  • 2
    Это совершенно другой вопрос, но да, это также определяется как в JLS. Операторы составного присваивания (+=, /= и т. Д.) Неявно возвращаются к назначаемому типу, но обычный оператор присваивания = этого не делает. – Erwin Bolwidt 10 April 2015 в 03:33

Я также нашел это интересным. Я недавно не работал слишком много в java, но я узнал немного информации, которая может быть полезной, играя с ней.

Я думаю, что это связано с автоматическим типом, который делает java.

System.out.println («1» + 2 + 3);

Печатает 123, как вы сказали. Поскольку «1» исполняется как строка, Java предполагает, что первая строка была строкой, последующие будут строкой для конкатенации, если не указано иное

. Хотя этот результат делает печать 15, когда вы определяете тип

System.out.println ("1" + (int) (2 + 3));

В этом случае он может завершить операцию перед конкатенацией.

Итак, я думаю, что java предполагает, что первая из них является строкой, остальные останутся строками и конкатенируют их.

EDIT: вы можете увидеть некоторую информацию об автоматическом type-conversion на веб-сайте oracle здесь

1
ответ дан Eric Groves 22 August 2018 в 18:20
поделиться
  • 1
    System.out.println("1" + (2+3)); также работает, вам не нужно указывать подвыражение на int – Erwin Bolwidt 10 April 2015 в 03:30
  • 2
    Хороший звонок - этого не заметил. Похоже, java оценивает подвыражение, прежде чем преобразовать его в целом в String для конкатенации, делая литье несущественным. – Eric Groves 10 April 2015 в 03:33

Оператор + перегружен в компиляторе. Если оба операнда являются числовыми, + является добавлением. Если оба или оба операнда являются String, + является конкатенацией строк. (Если один операнд является String, а другой - числовым, число передается в String). Наконец, + связывается слева направо.

Все это приводит к тому, что составная формула a + b + c + ... выполняет добавление слева направо, пока не попадет в первый операнд строки, после чего она переключается на конкатенация строк для остальной части формулы. Итак ...

"1" + 2 + 3 + 4 = 1234   /* cat cat cat */
1 + "2" + 3 + 4 = 1234   /* cat cat cat */
1 + 2 + "3" + 4 = 334    /* add cat cat */
1 + 2 + 3 + "4" = 64     /* add add cat */
1
ответ дан Peter Raynham 22 August 2018 в 18:20
поделиться

Это интересная часть строки. Когда String добавляется к любому другому типу данных, результирующее значение представляет собой String. Другая переменная также преобразуется в String и затем конкатенируется. Однако, когда два целых числа работают с знаком +, + действует как оператор сложения, а не оператор конкатенации. Если выражение в методе println () или print () содержит круглые скобки, сначала оценивается значение в круглых скобках. Рассмотрим следующий пример:

    int a = 5;
    int b = 6;
    System.out.println(a + b); // Output will be: 11
    System.out.println("5" + "6"); // Output will be: 56
    System.out.println("" + a + b); // Output will be: 56
    System.out.println(5 + 6 + a + " " + b + a); // Output will be: 16 65
    System.out.println("Result: " + a + b); // Output will be: 56
    System.out.println("Result: " + (a + b)); // Output will be: 11

Вы можете видеть разницу между двумя последними операциями sysout

1
ответ дан varpekv 22 August 2018 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: