如何解决为什么某些表达式的sizeof运算符工作方式不同?
我知道x++
之类的表达式或函数调用不会在sizeof运算符中求值。
当我运行以下代码时,我得到了4 8 8
作为输出。
有人可以向我解释第6、7、8行上实际发生了什么吗?
#include <stdio.h>
int main()
{
int x=10;
double y=10.0;
printf("%d ",sizeof (x=x+y));
printf("%d ",sizeof (y=x+y));
printf("%d ",sizeof (x+y));
return 0;
}
我发现,如果一个表达式包含一个隐式(如预增量)或显式(如=
)的赋值运算符x=x+y
,则该表达式不会在{{1 }}运算符。
我说得对吗?
解决方法
sizeof
运算符对自变量的数据类型进行操作。在您的代码中
- 表达式
(x=x+y)
产生类型int
,与x
一样 - 表达式
(y=x+y)
产生类型double
,与y
一样
根据通常的算术转换规则, - 表达式
x+y
产生类型double
。
尺寸是基于此计算的。
在您的平台中,sizeof(int)
是4
,而sizeof(double)
是8
,所以您会看到相应的输出。
也就是说,sizeof
产生类型为size_t
的结果,您必须使用%zu
格式说明符来打印结果。
sizeof
计算类型。
x
是int
,在您的系统上大小为 4个字节。
y
是double
,在您的系统上大小为 8个字节。
sizeof (x+y)
将计算两个值中的最大值,即double
和 8个字节。
x=x+y
仍然是int
,因为将从int
double
到x+y
类型的转换。
因此sizeof (x=x+y)
是 4个字节。
y=x+y
仍然是double
,因为x+y
的类型为double
。
因此sizeof (y=x+y)
是 8个字节。
对表达式进行评估,只是这些评估的结果有所不同:
x=x+y
可以读为:
int = float + int
发生的是,先计算该结果,然后将其转换为int,然后得到结果4:sizeof(int)= 4。
第二行是相似的,但带有浮点数。
在最后一行,您计算出sizeof(float + int)等于sizeof(float)= 8。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。