С++ - тип деления?

Я хочу убедиться, что мое понимание типа возврата C++,

int / int => return is int?

float / float => return is which type? float?

double /double => return is double?

int / double => return is double?

int / float => return is float?

Пожалуйста, поправьте меня, если я ошибаюсь.

Ответ 1

Все это правильно. Вот что говорит стандарт С++ 03 (§5/9):

Многие двоичные операторы, которые ожидают операнды арифметики или типа перечисления, вызывают конверсии и дают аналогичные результаты. Цель состоит в том, чтобы дать общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:

  • Если любой из операндов имеет тип long double, другой должен быть преобразован в long double.
  • В противном случае, если любой операнд double, другой должен быть преобразован в double.
  • В противном случае, если любой операнд float, другой должен быть преобразован в float.
  • В противном случае интегральные акции (4.5) должны выполняться на обоих операндах.
  • Затем, если любой операнд unsigned long, другой должен быть преобразован в unsigned long.
  • В противном случае, если один операнд является long int, а другой unsigned int, то если a long int может представлять все значения unsigned int, unsigned int преобразуется в long int; в противном случае оба операнда должны быть преобразованы в unsigned long int.
  • В противном случае, если любой операнд long, другой должен быть преобразован в long.
  • В противном случае, если любой операнд unsigned, другой должен быть преобразован в unsigned.

[Примечание: в противном случае единственным оставшимся случаем является то, что оба операнда int]

Ответ 2

operator/ для базовых типов данных (как и большинство, если не все, для базовых типов) возвращает самый сильный тип двух операндов.

Таким образом, ответ на все ваши вопросы да.


В общем, типы с плавающей запятой сильнее целых, а unsigned сильнее, чем подписанные...

Определяя > как "сильнее чем", мы можем сказать, что:

long double > double > float > unsigned long > long > unsigned int > int > unsigned short > short > unsigned char > char

Ответ 3

Вы верны во всех случаях. Правила для операций, включающих по меньшей мере один тип с плавающей запятой, заключаются в том, что если любой тип является long double, результатом является long double; в противном случае, если любой тип double, результат равен double, иначе результат имеет тип float.

Арифметические операции между двумя int приводят к результату int.

Правила между другими типами немного сложнее и могут быть зависимыми от реализации; для почти всех операций целые акции означают, что операнды продвигаются, по меньшей мере, до размеров int, производящих по меньшей мере результат размера int.

Ответ 4

Учитывая только три типа (float, double и int):

  • Если какой-либо из операндов double, то результат будет double.
  • Если какой-либо из операндов float, то результат будет float.
  • Иначе результат будет int.

Ответ 5

Результат будет напечатан (если существует правило) для назначения. Если у вас есть int x = dY + iZ; Затем продвижение по службе приведет к удвоению результата сложения, но он будет преобразован в int, когда ему присвоено значение x. Google "изменение переменных в С++" для более подробной информации.