sizeof(a)++编译通过,++sizeof(a)报告缺少合法的左值

[复制链接]
查看11 | 回复5 | 2010-11-11 20:46:05 | 显示全部楼层 |阅读模式
init a
sizeof(a)++;//合法,编译通过
++sizeof(a);//不合法,编译不过,报告说++需要合法的左值
如何解释?
左值就是有存储空间的,比如变量
sizeof(a)只是计算出一个结果,平时都是当常量使用的
为什么可以后++,而不能前++
难道后++时,sizeof(a)是变量,前++的sizeof(a)是常量?
这个问题显然不是我写出来的,是我在面试的时候被人问到的
相信应该是个非常重要的知识点
编译优化的说法看上去非常有道理,
但是如果会优化的话,写出4++之类的代码应该也没错吧?
可是4++是语法错误(为什么不会优化为5?),
sizeof(a)++反而会优化为5?

回复

使用道具 举报

千问 | 2010-11-11 20:46:05 | 显示全部楼层
关键是要把sizeof(a)++理解为:sizeof((a)++),详情请看后面的分析。1.要理解sizeof运算符的语法,其实sizeof后面可以直接跟表达式的,如:sizeof a;
// 与sizeof(a);等价
sizeof a+1;
// 与sizeof(a+1);等价2.要理解sizeof后面的表达式到底会不会被编译程序编译,并进行真正的计算其实编译器只想知道sizeof 后面的表达式的类型(进而知道所占存储空间),但是并不会真正的计算后面的表达式。如:sizeof b=3+1; // 假设b原来为0,则编译这条语句以后b仍会为0下面我们分析一下sizeof(a)
回复

使用道具 举报

千问 | 2010-11-11 20:46:05 | 显示全部楼层
init a;sizeof(a)++;//后++,是等它计算完了在+++sizeof(a);//前++,它都还没计算你往哪+//支持1楼,没事写这么难懂的代码干嘛
回复

使用道具 举报

千问 | 2010-11-11 20:46:05 | 显示全部楼层
楼主,其实就是说,sizeof(a)++是因为知道了sizeof(a)的值才++所以不会报错,而++sizeof(a)是先++在用sizeof()的值,但是sizeof()在++前还没有算出来,所以就会报错原理跟int i;scanf("%d",&i);int a;一样的,这样是不能通过编译,因为系统要为数组分配
回复

使用道具 举报

千问 | 2010-11-11 20:46:05 | 显示全部楼层
sizeof(a)的结果是个数字,不是变量,数字不能作为左值的;int a;sizeof(a)的结果是4;你的代码就是:4++;++4;也就是 4 = 4+1;数字4是计算结果,不是变量,没有分配空间,所以不能这样操作;int asizeof(a++);sizeof(++a);
回复

使用道具 举报

千问 | 2010-11-11 20:46:05 | 显示全部楼层
我只能这么解释:sizeof(a)++,优化起的作用,由于x++直接解释成x, 而sizeof(a)是常量,所以,直接将sizeof(a)++优化成4;那4++为何不行呢?因为这个还没到优化那一步,直接从语法检查上就过不了关(一个常量值是不能有++这种运算符的)++sizeof(a)呢?因为它解释成(sizeof(a)=sizeof(a)+1),
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行