++ * var ++和++ var ++有什么区别? 为什么++ * var ++可以工作,而++ var ++结果却在C中带有左值必需错误?
答案 0 :(得分:5)
++var++
被分组为++(var++)
,由于var++
不是lvalue
,因此导致编译失败。 (非正式地说,这意味着您不能将其放在作业的左侧)。
++*var++
被分组为++(*(var++))
,这意味着使用指针算法将指针var
递增1,然后将var
的初始值的取消引用值增加1。
答案 1 :(得分:5)
即使我只是在评论中建议这样做,但查看所有可能性可能还是有用的。对于指针变量p
,我们有:
++p
递增p
,产生新价值p++
递增p
,产生旧值*++p
递增p
,访问它新指向的内容*p++
递增p
,访问它以前指向的内容++*p
递增p
指向的内容,产生新的价值(*p)++
递增p
指向的内容,产生旧值++*++p
递增p
,递增其新指向的值,产生新值(*++p)++
递增p
,递增其新指向的值,产生旧值++(*p++)
递增p
,递增其指向的位置,产生新值(*p++)++
递增p
,递增其指向的位置,产生旧值++p++
无意义案例9和11是您所要问的。在第9种情况下,我添加了显式括号,以使情况更加清楚。我猜想,如果您把它们留在外面并说++*p++
也是可行的,但这会使我发疯,所以我不想再考虑了。