直到现在我才相信没有使用一元+
运算符。
但后来我遇到了以下例子:
char ch;
short sh;
int i;
printf("%d %d %d",sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4
printf("%d %d %d",sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4
这是否意味着+
正在进行类型转换?
因为它的行为与以下相同
printf("%d %d %d",sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4
这迫使我认为+
正在进行类型转换。
但是我在double
double f;
printf("%d %d",sizeof(+f),sizeof((int)f),sizeof(f)); // output: 8 4 8
这迫使我重新考虑一元+
运算符。
所以我的第二个问题是:一元+
运算符在sizeof
运算符中有特殊效果吗?
答案 0 :(得分:20)
一元+ 对其操作数执行整数提升,我们可以通过转到草案C99标准部分6.5.3.3
一元算术运算符来看到(< em>强调我的前进):
一元+运算符的结果是它的值(提升) 操作数。 整数提升是在操作数上执行的 结果具有提升类型。
和部分6.3.1
算术操作数表示:
如果int可以表示原始类型的所有值,则值为 转换为int;否则,它将转换为unsigned int。 这些称为整数促销。 48) 所有其他类型都是 整数促销不变。
请注意,所有其他类型的整数促销均未更改,因此 double 保持 double 。这也适用于 float ,它不会被提升为 double 。
另请注意,使用%d
作为sizeof
的结果是未定义的行为,因为结果是 size_t 。正确的格式说明符为%zu
。
答案 1 :(得分:4)
当较大类型涉及较大类型的表达式时(例如,char
小于short
小于int
< em>可能小于long
),所涉及的类型被提升到更大的tyoes。
所以是的,当你使用一元+
运算符时,你得到一个int
,因为int
是C中的自然整数类型。
关于double
类型,C的自然浮点类型为double
,这就是为什么没有对已经类型为double
的值或变量进行推广的原因。
sizeof
运算符与此无关。
答案 2 :(得分:4)
操作员一元+
触发&#34;初始&#34; 通常的算术转换,因此所有整数操作数(等级低于int
和unsigned int
的等级)都会提升为int
(或unsigned int
如果int
类型未涵盖在该实现上宣传的所有类型值。)
答案 3 :(得分:2)
不是sizeof
,而是一元+
本身。一元+
的操作数经历“通常的算术转换”。例如,参见this other answer涉及普通加法。