首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运算符的操作数

运算符的操作数
EN

Stack Overflow用户
提问于 2019-01-31 14:06:46
回答 2查看 85关注 0票数 4

我明白…的结果

代码语言:javascript
复制
int nData = 10;
printf("%d", sizeof(nData + 2.0));

是"8“

为什么每个结果

代码语言:javascript
复制
int nData = 10;
printf("%d", sizeof(nData = 2.0));
printf("%d", sizeof(nData += 2.0));

不是8,而是4?为什么nData不能成为12.0sizeof(nData += 2.0)12

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-31 14:08:58

因为2.0是double类型的常量,所以表达式nData + 2.0按照C标准6.3.1.8节中指定的“常规算术转换”,具有double类型:

首先,如果任何一个操作数的对应实类型是长双,则另一个操作数被转换成相应的实类型为长双的类型,而不改变类型域。 否则,如果任何一个操作数的对应实类型为双,则另一个操作数将在不改变类型域的情况下转换为相应的实类型为double的类型。

因此,sizeof计算为double的大小。

对于nData = 2.0nData += 2.0,每个表达式都有int类型,因为这是赋值的左侧类型。因此,sizeof求值为int的大小。

此外,sizeof操作符的操作数仅在编译时时计算其类型。这意味着在运行时不计算任何赋值或增量。因此,在第二个示例中,在使用nData的两行之后,sizeof的值仍然是10。在运行时计算sizeof的操作数的唯一时间是如果操作数是可变长度数组。

票数 5
EN

Stack Overflow用户

发布于 2019-01-31 14:07:42

为什么nData不能成为12.0或者sizeof(nData += 2.0)__的12

sizeof是一个编译器时间运算符,它操作的是数据类型,而不是值。

换句话说,除了参数是VLA之外,不计算sizeof的操作数。

引用C11,第6.5.3.4节

sizeof运算符生成其操作数的大小(以字节为单位),该操作数可能是一个表达式或类型的括号大小名称。大小由操作数的类型确定。如果操作数的类型是可变长度数组类型,则计算操作数;否则,将不计算操作数,结果是整数常量。

所以,就你来说,

代码语言:javascript
复制
  printf("%d", sizeof(nData + 2.0));   // data == int, 2.0 == double

是相同的

代码语言:javascript
复制
 printf("%d", sizeof(double));  //  as the resulting "type" of the addition, 
                                //   'int + double' would be  'double'

哪一个更好

代码语言:javascript
复制
 printf("%zu", sizeof(double));   //not %d

因为sizeof生成size_t类型。

此外,关于2.0类型为double,参见第6.4.4.2章

浮动常量有一个意义和部分,后面可以是指数部分和指定其类型的后缀。意义和部分的组成部分可以包括表示全数部分的数字序列,后面是句点(.),然后是表示分数部分的数字序列。..。

未加后缀的浮动常量具有double类型。..。

因此,像2.0这样的常量值具有double类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54462357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档