Веточка для петли для массивов с ключами

Здесь есть два вопроса. Во-первых, «почему короткий плюс короткий результат в int?»

Ну, предположим, что короткий плюс короткий был коротким и посмотрел, что произойдет:

short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;

И среднее значение конечно, -9845, если этот расчет сделан в шортах. Сумма больше максимально возможного короткого, поэтому она обертывается до отрицательной, а затем вы делите отрицательное число.

В мире, где целые арифметические обертывания вокруг него гораздо разумнее делать все вычисления в int, тип, который, вероятно, будет иметь достаточный диапазон для типичных вычислений, чтобы не переполняться.

Второй вопрос:

  • short plus short is int
  • присвоение int short является незаконным
  • a + = b такое же, как a = a + b
  • , поэтому short + = short должно быть незаконным
  • так почему это законно?

Вопрос имеет неправильную предпосылку; третья строка выше неверна. Спецификация C # заявляет в разделе 7.17.2

В противном случае, если выбранный оператор является предопределенным оператором, если тип возврата выбранного оператора явно конвертируется в тип x, а если y неявно преобразуется в тип x или оператор является оператором сдвига, тогда операция оценивается как x = (T) (x op y), где T - тип x, за исключением того, что x оценивается только один раз.

Компилятор вставляет приглашение от вашего имени. Правильное рассуждение:

  • short plus short is int
  • присвоение int short является незаконным
  • s1 + = s2 совпадает с s1 = (short) (s1 + s2)
  • , поэтому это должно быть законным

Если оно не ввело листинг для вас, тогда было бы невозможно использовать составное назначение на много типов.

139
задан Emma 2 May 2019 в 04:26
поделиться