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

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

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

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

一元+对其操作数执行整数提升,我们可以通过转到草案C99标准部分6.5.3.3 一元算术运算符来看到这一点( 强调我的前进 ):

一元+运算符的结果是其(提升的)操作数的值。 整数提升在操作数上执行 ,结果具有提升类型。

6.3.1算术操作数说:

如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int。 这些被称为整数促销48) 所有其他类型由整数促销不变。

请注意,所有其他类型都不会被整数促销更改,因此double会保持双倍 。 这也适用于浮动 ,不会被提升为双倍

另请注意,使用%d作为sizeof的结果是未定义的行为,因为结果是size_t 。 正确的格式说明符是%zu

当较小类型涉及具有较大类型的表达式时(例如, char小于short ,其大多小于int ,其可能小于long ),所涉及的类型将被提升为更大的类型。

所以是的,当你使用一元+运算符时,你得到一个int ,因为int是C中的自然整数类型。

关于double类型,C的自然浮点类型是double ,这就是为什么没有对已经是double类型的值或变量进行推广的原因。

sizeof运算符与此无关。

运算符一元+触发“初始” 通常的算术转换 ,因此所有整数操作数(其类型的排名低于intunsigned int等级)将被提升为int (如果int类型未涵盖在该类型上提升的所有类型的值,则为unsigned int实现)。

它不是sizeof ,它是一元+本身。 一元+的操作数经历“通常的算术转换”。 参见,例如,涉及普通加法的这个其他答案 。