一元+运算符会进行类型转换吗?

时间:2014-07-17 13:56:29

标签: c sizeof unary-operator integer-promotion

直到现在我才相信没有使用一元+运算符。

但后来我遇到了以下例子:

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运算符中有特殊效果吗?

4 个答案:

答案 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; 通常的算术转换,因此所有整数操作数(等级低于intunsigned int的等级)都会提升为int(或unsigned int如果int类型未涵盖在该实现上宣传的所有类型值。)

答案 3 :(得分:2)

不是sizeof,而是一元+本身。一元+的操作数经历“通常的算术转换”。例如,参见this other answer涉及普通加法。