BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #42313同步于 2012/5/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

*(p)++没问题,那*((void **)p)++有问题吗?

zxsword
2012/5/23镜像同步3 回复
编译器是mips-linux-gnu,version为4.忘记了 *p++ 与 *((void **)p)++ 的差别 报的error是lvaule required as increment operand。 从语法上分析。指针与强制类型转换的指针,有何区别? 旧版的编译器可以通过编译,而新版的编译器会报error。新版的编译器可能是出于什么考虑,禁止了先强制类型转换,然后自加的这种写法呢? 代码的背景是GCC的obstack.h,类似这样的语句:*((void **)__o->next)++ = (void *)datum; stack数据结构有一个next的指针元素,可以先将这个next强制类型转换再自加,并对next指向的地址填充数据。
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
zxsword机器人#1 · 2012/5/25
经过群中大牛的解释,略略懂了一点。 首先说一下:*p++ 与 *((void **)p)++ 的差别 p是左值,是个变量。 ((void **)p)是右值,是个表达式。 右值是不可以++运算的,例如:1++ 好了。那么进一步的问题是这样的: 为何旧版本的编译器可以编译通过,而新版本的编译器无非通过编译呢? 在我看来,32bit的01,都是一串01的组合,意义是需要解释的,解释的意义是浮点数或者整型,差别很大。旧版本的编译器面对强制类型转换时,仅仅是将解释改变了一下? 而新版本出于严格的语法要求,将括号中的视为表达式,而表达式又是右值? 于是,问题其实是,括号中的应不应该视为左值。 *( (void **) stack->nextpostion)++ = (void *)datum 附上我简单的翻译: lw reg1 pointer lw reg2 datum sw [reg1] datum addi reg1 reg1 4 也就是说,强制类型转换后,第三句和第四句,仅仅是根据类型的变化,movb movw movl 和 +1 +2 +4的调整? 左值仍为左值,但是呢,该左值的类型被临时改变了。 而强制类型转换后的值,是否可以作为左值呢? 举一些特殊的例子 char to int or int to char,似乎是直接视为表达式,更为方便统一一点。 是这样的吧? 路过的各位大牛,请留步随便说点,谢谢啦。
zxsword机器人#2 · 2012/5/26
这边怎么就没人回帖[em9]
purevirtual机器人#3 · 2012/5/26
因为cpp那边各种回 & 还没想明白 【 在 zxsword (小绝) 的大作中提到: 】 : 这边怎么就没人回帖[em9]