我明白…的结果
int nData = 10;
printf("%d", sizeof(nData + 2.0));是"8“
为什么每个结果
int nData = 10;
printf("%d", sizeof(nData = 2.0));
printf("%d", sizeof(nData += 2.0));不是8,而是4?为什么nData不能成为12.0或sizeof(nData += 2.0)的12
发布于 2019-01-31 14:08:58
因为2.0是double类型的常量,所以表达式nData + 2.0按照C标准6.3.1.8节中指定的“常规算术转换”,具有double类型:
首先,如果任何一个操作数的对应实类型是长双,则另一个操作数被转换成相应的实类型为长双的类型,而不改变类型域。 否则,如果任何一个操作数的对应实类型为双,则另一个操作数将在不改变类型域的情况下转换为相应的实类型为double的类型。
因此,sizeof计算为double的大小。
对于nData = 2.0和nData += 2.0,每个表达式都有int类型,因为这是赋值的左侧类型。因此,sizeof求值为int的大小。
此外,sizeof操作符的操作数仅在编译时时计算其类型。这意味着在运行时不计算任何赋值或增量。因此,在第二个示例中,在使用nData的两行之后,sizeof的值仍然是10。在运行时计算sizeof的操作数的唯一时间是如果操作数是可变长度数组。
发布于 2019-01-31 14:07:42
为什么
nData不能成为12.0或者sizeof(nData += 2.0)__的12?
sizeof是一个编译器时间运算符,它操作的是数据类型,而不是值。
换句话说,除了参数是VLA之外,不计算sizeof的操作数。
引用C11,第6.5.3.4节
sizeof运算符生成其操作数的大小(以字节为单位),该操作数可能是一个表达式或类型的括号大小名称。大小由操作数的类型确定。如果操作数的类型是可变长度数组类型,则计算操作数;否则,将不计算操作数,结果是整数常量。
所以,就你来说,
printf("%d", sizeof(nData + 2.0)); // data == int, 2.0 == double是相同的
printf("%d", sizeof(double)); // as the resulting "type" of the addition,
// 'int + double' would be 'double'哪一个更好
printf("%zu", sizeof(double)); //not %d因为sizeof生成size_t类型。
此外,关于2.0类型为double,参见第6.4.4.2章
浮动常量有一个意义和部分,后面可以是指数部分和指定其类型的后缀。意义和部分的组成部分可以包括表示全数部分的数字序列,后面是句点(.),然后是表示分数部分的数字序列。..。
和
未加后缀的浮动常量具有
double类型。..。
因此,像2.0这样的常量值具有double类型。
https://stackoverflow.com/questions/54462357
复制相似问题