Значения и типы данных - PullRequest
       4

Значения и типы данных

0 голосов
/ 28 декабря 2011

Дано:

int x = 10;
double d = -3.0;
boolean f = false;

1.

Почему следующее остается двойным после того, как оно приведено к типу int ... Для второго также, почему оно выводит число с плавающей точкой, если оно определено как long?:

(int) d / 2.0
(long) d * 2f

2.

Почему первый из следующих выводит строку (?), А последний число?

"2" + x + 2
"3" + 3 * x

Но тогда возникает ошибка со следующим:

"5" + i + 2

3.

Кроме того, что происходит на самом деле и каков результат?

d++ + d

4.

Когда используется Math.round, почему он конвертирует следующий двойник в число с плавающей точкой, или это одно и то же?

Math.round(x / d)

Ответы [ 4 ]

2 голосов
/ 28 декабря 2011

1.

Это:

(int) d / 2.0

такой же, как этот:

((int) d) / 2.0

Возможно, вы имели в виду это?

(int)(d / 2.0)

2.

Они обе «печатают» строки (если вы говорите об их использовании в качестве аргумента System.out.println).

Эти:

"2" + x + 2
"3" + 3 * x

такие же, как эти:

("2" + x) + 2
"3" + (3 * x)

, которые совпадают с этими (при условии x = 10):

("2" + 10) + 2
"3" + 30

, которые такие же, как эти:

"2102"
"330"

3.

Я не могу вспомнить, что здесь должно произойти. Но вам никогда не нужно / не хочется писать такой код, так что это не имеет значения!

4.

Тип возвращаемого значения Math.round - это целочисленный тип, а не тип с плавающей запятой.

1 голос
/ 28 декабря 2011

Почему следующее остается двойным после того, как оно приведено к типу int ... Для второго также, почему оно выводит число с плавающей точкой, если оно определено как long?:

(int) d / 2.0
(long) d * 2f

Поскольку приоритет оператора приведения (int) выше, чем у операторов / и *.Вы должны прочитать это так:

((int) d) / 2.0

((long) d) * 2f

Почему первое из следующего выдает строку (?), А второе число?

"2" + x + 2
"3" + 3 * x

Я думаю, что это строка в обоих случаях, вы должны «прочитать» это выражение следующим образом:

("2" + x) + 2
"3" + (3 * x)

Но тогда возникает ошибка со следующим:

"5" + i + 2

В чем ошибка?

Кроме того, что происходит на самом деле и каков результат?

d++ + d

Это последовательность действий:

  1. tmp = d
  2. d = d + 1
  3. return tmp + d

Когда используется Math.round, почему он конвертирует следующий double в число с плавающей точкой, или это одно и то же?

Math.round(x / d)

Преобразуется в long, поскольку тип возвращаемого значения Math.round(double) равен long

1 голос
/ 28 декабря 2011
(int) d / 2.0
(long) d * 2f

Вы по-прежнему занимаетесь математикой с плавающей запятой, т. Е. Один операнд все еще является двойным / с плавающей точкой, и, следовательно, результатом является двойное / с плавающей запятой.

"2" + x + 2
"3" + 3 * x

Первым будет просто конкатенация, то есть тип выражения будет String, и, таким образом, все операнды преобразуются в строку. За x=1 вы получите "212".

Второе подчиняется приоритету оператора, то есть * вычисляется перед +, и, таким образом, выражение 3 * x является целочисленной математической операцией, результат которой затем будет преобразован в строку как "3" + result.

"5" + i + 2

Ошибка в вашем коде, опубликовать исключение. Скорее всего i не определено.

d++ + d

Посмотрите на операторы приоритета и постинкрементные операторы. x++ вернет значение x, а затем увеличит его. Тогда предыдущее значение x будет добавлено к новому значению. Вы можете думать, что это похоже на x + (x+1).

Когда используется Math.round, почему он конвертирует следующий double в число с плавающей точкой, или это одно и то же?

Math.round (x / d)

Там нет преобразования, только перегруженный метод (один берет двойное, а другое - плавающее). В основном float имеет меньшую точность, чем double, но оба являются числами с плавающей запятой.

0 голосов
/ 28 декабря 2011

Слишком много вопросов в одном.

  • Вы используете операнд, а не выражение, и типы будут повышаться.
  • Что они на самом деле печатают, и как вы различаете их типы? Проверьте Приоритет Java-оператора .
  • Потому что нет i.
  • Вы можете распечатать результат.

Секция JLS также может быть полезной; на многие ваши вопросы есть ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...