2015-12-28 5 views
1
char cval; 
short sval; 
long lval; 
sval + cval; // sval and cval promoted to int 
cval + lval; // cval converted to long 

Это фрагмент кода на C++ Primer. Я знаю sval+cval генерирует тип Int согласноАрифметическое преобразование VS интегральное продвижение

преобразовать малые интегральные тип в больший интегральный тип. Типы bool, char, signed char, unsigned char, short и unsigned short - это , предназначенные для int, если все возможные значения этого типа соответствуют int.

Но для последнего я не мог понять, почему он использует «преобразованные». Почему cval не назначен int первым, а затем в int конвертированы (или, может быть повышен, я не уверен, что способствовало можно использовать из int в long, потому что я вижу только определение продвижения на более мелким шрифтом, чтобы int) в long. Я не видел никаких объяснений или примеров на char прямо на long в той части книги.
Есть ли что-то не так с моим пониманием?
Я совершенно новый на C++, кто-то, пожалуйста, просветите меня! Спасибо заранее!

ответ

2

Операторы-аддиторы выполняют так называемые usual arithmetic conversion в своих операндах, которые могут включать интегральные рекламные акции, а затем после этого мы можем иметь дополнительные преобразования. Цель состоит в том, чтобы дать общий тип, и если рекламные акции не выполняются, то требуется дальнейшее преобразование.

Это описано в разделе 5[выражение] стандартного проекта C++, который говорит (курсив мой):

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

и включает в себя следующую пулю:

  • В противном случае, интегральные акции (4.5), должны быть выполнены на обоих операндах.61 Затем к продвинутым операндам применяются следующие правила :

, который имеет следующие пули:

  • Если оба операнда имеют одинаковый тип, дальнейшее преобразование не требуется

  • В противном случае, если оба операнда подписали целочисленные типы или оба имеют неподписанные целые типы, операнд с типом ранга целочисленного разряда должен быть преобразован в тип операнд с большим рангом.

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

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

Во втором случае после рекламных акций они не имеют (int и long), поэтому требуется дальнейшее преобразование.

+0

Спасибо за усилия! – Des1gnWizard

1

От C++ 11 Стандарт на:

4 Стандартные преобразования

1 Стандартные преобразования неявные преобразования со встроенным в значении. В пункте 4 перечисляется полный набор таких конверсий . Стандартная последовательность преобразования представляет собой последовательность стандартных преобразований в следующем порядке:

- Нулевое или одно преобразование из следующего набора: преобразование lvalue-to-rval, преобразование матрицы в указатель и преобразование функции в указатель ,

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

- Zero или один квалификация изменение.

В выражении,

cval + lval; 

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

+0

Приобретено! Спасибо за усилия! – Des1gnWizard