char cval;
short sval;
long lval;
sval + cval; // sval and cval promoted to int
cval + lval; // cval converted to long
这是关于C ++ Primer的一段代码。
我知道sval+cval
根据
将小积分类型转换为更大的积分类型。类型 bool,char,signed char,unsigned char,short和unsigned short 如果该类型的所有可能值都适合int。
,则提升为int
但对于最后一个我无法理解为什么它使用“转换”。为什么cval
不会先提升为int
,然后int
已转换(或者可能已提升,我不确定是否可以将提升用于int
到{{1}因为我只看到较小类型的促销定义为long
)到int
。我在本书的那一部分long
直接char
没有看到任何解释或例子。
我的理解有什么问题吗?
我是C ++的新手,有人请赐教!非常感谢提前!
答案 0 :(得分:2)
加法运算符在其操作数上执行所谓的usual arithmetic conversion,其中包括整体促销,然后我们可以进行进一步的转换。目的是产生一种普通类型,如果促销没有实现,则需要进一步转换。
C ++标准草案的5
[expr] 部分对此进行了介绍(强调我的):
许多期望算术或枚举类型操作数的二元运算符会导致转换和产生 结果类型以类似的方式。 目的是产生一个共同类型,这也是结果的类型。 此模式称为通常的算术转换,定义如下
并包含以下项目符号:
- 否则,两个操作数上的整数促销(4.5)将被执行 .61然后以下 规则应适用于推广的操作数:
有以下项目符号:
如果两个操作数具有相同类型,则无需进一步转换
否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型, 具有类型的较小整数转换等级的操作数应转换为该类型 排名较高的操作数。
- 否则,如果具有无符号整数类型的操作数的等级大于或等于 另一个操作数的类型的等级,带有符号整数类型的操作数应转换为 具有无符号整数类型的操作数的类型。
- 否则,如果带有符号整数类型的操作数的类型可以表示的所有值 具有无符号整数类型的操作数的类型,具有无符号整数类型的操作数应为 转换为带有符号整数类型的操作数的类型。
- 否则,两个操作数都应转换为对应的无符号整数类型 带有符号整数类型的操作数的类型。
因此,在促销后的第一种情况下,它们都具有相同的类型( int ),因此无需进一步转换。
在促销后的第二种情况下,他们没有( int和long ),因此需要进一步转换。
答案 1 :(得分:1)
来自C ++ 11标准:
4次标准转化
1标准转化是具有内置含义的隐式转化。第4条列举了全套这类 转换。标准转换序列是按以下顺序的一系列标准转换:
- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换。
- 来自以下设置的零次或一次转换:整数促销,浮点促销,积分转换,浮点转换,浮点积分转换,指针转换,指向成员转换的指针以及布尔转换。
- 零或一个资格转换。
在表达式中,
cval + lval;
由于cval
不属于long
类型,因此必须将其转换为long
。但是,在应用标准转化的过程中,整合促销优先于转化。因此,cval
在转换为int
之前会先提升为long
。