2016-10-29 2 views
-2
int number; 
number = 80; 

number = (int)math.sqrt(number++) 
System.out.println(number) 

Это код выше. Я новичок в программировании и имею достойное место в математике.Может кто-нибудь объяснить это число = 80; number = (int) math.sqrt (число ++); число = 8?

Я знаю SQRT равно 8. Однако в данном случае я запутался, почему ответ не 9.

Я знаю УАК ++ и ВДП ++ и как это может повлиять на ответ, однако, учитывая, что ПЛЮС выше кода печати. ​​Я запутался, почему один не добавлен к восьмерке, а затем напечатан номер 9.

+0

'8.944 ...' становится '8' при нажатии на' int'. Это не имеет никакого отношения к фактической печати с помощью 'println()'. Вы сохраняете это значение в переменной 'number' и ** then **, увеличивая его. Инкремент никогда не сохраняется в 'number'. – Gendarme

+0

Привет, Его Джо, Спасибо, что помогли мне понять эту концепцию. Regaurds, joe – JAVAJoseph

ответ

1

number++ postincrements, что означает, что выражение оценивается до 80 внутри функции квадратного корня.

Квадратный корень из 80 строго меньше 9 поэтому его целое преобразование (сделано с (int)) является 8.

+1

Здравствуйте, Большое спасибо за ваш ответ. Спасибо Joe – JAVAJoseph

1
number = (int)math.sqrt(number++) , 

Здесь Первое выражение вычисляется, то число возрастает, то будет почему.

Если вы измените его на

number = (int)math.sqrt(++number) , 

тогда он будет работать

+0

Здравствуйте, Большое спасибо за ваш ответ. Это был ответ, который смутил меня в прошлой статье для моего курса Юни. Поэтому я был в основном связан только с тем, почему я получил результат, который я сделал, а не исправил сценарий. Однако большое спасибо за ваш ответ joe – JAVAJoseph

3

Обновление ++ делает на number в правом операнде присваивания переписываются назначая результат общего выражения назад до number.

Это покрытие JLS§15.26.1. Вот что происходит в этом выражении присваивания:

  1. Левая рука определяется как переменная
  2. Правая рука выражения присваивания вычисляется:
    1. Значение 80 читается от number
    2. number увеличивается до 81 (это не имеет значения)
    3. math.sqrt вызывается со значением 80 читать Бове
    4. Результат math.sqrt преобразуется в int
  3. Результат от # 2 выше (8) хранится в number

Обратите внимание на порядок этапов 2.1 и 2.2 выше. Это потому, что вы использовали постфикс number++. Порядок будет отменен (и результат будет другим), если вы использовали ++number.

++number с правой стороны не оказывает никакого влияния на результат выражения. (В Java. В некоторых других языках это считается Undefined Behavior, позволяющим компилятору делать все, что захочет.)

В частности (поскольку вы упомянули, что хотите получить значение 9), ++ не применяется после того, как результат присвоения сохранен в number. Он применяется сразу после считывания значения number при передаче его в math.sqrt.

+0

Фантастический ответ! –

+0

Проще говоря, побочный эффект является неотъемлемой частью оценки «i ++». Как только вы используете результат выражения, побочный эффект уже применяется. –

+0

Здравствуйте, Большое спасибо за ваш невероятный информативный ответ. Спасибо, Joe – JAVAJoseph

0

В java приращение post влияет на переменную при вычислении выражения, а не после выполнения оператора. Таким образом, переменная получает приращение до 81, предыдущее значение 80 передается в sqrt и, наконец, получает присвоенный 8.

+0

Здравствуйте, Большое спасибо за ваш ответ. спасибо Джо. – JAVAJoseph

 Смежные вопросы

  • Нет связанных вопросов^_^