15

直到现在我都相信一元运算+符是没有用的。

但是后来我遇到了以下示例:

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

4 回答 4

21

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

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

和部分6.3.1 算术操作数说:

如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,它将转换为无符号整数。 这些被称为整数促销48) 整数提升不会改变所有其他类型。

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

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

于 2014-07-17T14:12:38.340 回答
4

当具有较大类型的表达式中涉及较小类型时(例如,char小于shortwhich most小于intwhich可能小于long),所涉及的类型将被提升为较大的类型。

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

关于double类型,C 的自然浮点类型是double,这就是为什么没有提升已经是 type 的值或变量的原因double

运营商与此sizeof无关。

于 2014-07-17T14:00:46.593 回答
4

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

于 2014-07-17T14:05:30.117 回答
2

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

于 2014-07-17T14:01:38.640 回答