++*var++ 和 ++Var++ 有什么区别?
what is the difference between ++*var++ and ++Var++?
++*var++ 和 ++var++ 有什么区别?
为什么 ++*var++ 工作而 ++var++ 结果在 C 中出现左值必需错误?
++var++
被分组为 ++(var++)
,这会导致编译失败,因为 var++
不是 lvalue
。 (非正式地说,这意味着您不能将其放在作业的左侧)。
++*var++
被分组为 ++(*(var++))
这意味着使用指针算法将指针 var
增加 1,然后将 var
的初始值的解引用值增加1.
尽管我只是在评论中建议不要这样做,但查看所有可能性可能会有用。对于指针变量 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++
也可以,但这让我的头爆炸了,所以我不想再考虑了。
++*var++ 和 ++var++ 有什么区别? 为什么 ++*var++ 工作而 ++var++ 结果在 C 中出现左值必需错误?
++var++
被分组为 ++(var++)
,这会导致编译失败,因为 var++
不是 lvalue
。 (非正式地说,这意味着您不能将其放在作业的左侧)。
++*var++
被分组为 ++(*(var++))
这意味着使用指针算法将指针 var
增加 1,然后将 var
的初始值的解引用值增加1.
尽管我只是在评论中建议不要这样做,但查看所有可能性可能会有用。对于指针变量 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++
也可以,但这让我的头爆炸了,所以我不想再考虑了。