为了账号安全,请及时绑定邮箱和手机立即绑定

为什么(x+)不增加x?

为什么(x+)不增加x?

C
叮当猫咪 2019-07-03 13:45:38
为什么(x+)不增加x?下面是在dev c+windows中编译的代码:#include <stdio.h>int main() {     int x = 5;     printf("%d and ", sizeof(x++)); // note 1     printf("%d\n", x); // note 2     return 0;}我希望x执行后为6岁附注1..然而,产出是:4 and 5有谁能解释一下为什么x之后不增加附注1?
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

C99标准(重点是我的)

6.5.3.4/2

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


查看完整回答
反对 回复 2019-07-03
?
慕容708150

TA贡献1831条经验 获得超4个赞

sizeof编译时运算符,所以在编译时sizeof并将其操作数替换为结果值。这个操作数是未评估(除非它是可变长度数组);只有类型结果很重要。

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;}int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;}

产出:

2

short占据我的机器上的两个字节。

将函数的返回类型更改为double:

double func(short x) {// rest all same

会给8作为输出。


查看完整回答
反对 回复 2019-07-03
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

sizeof(foo)尽力在编译时发现表达式的大小:

6.5.3.4:

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

简而言之:可变长度数组,在运行时运行。(注:变长阵列是一个特定的特性-而不是分配给malloc(3))否则,只有类型表达式的计算,以及在编译时计算的表达式。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 369 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信