【问题标题】:what is the difference between ++*var++ and ++Var++?++*var++ 和 ++Var++ 有什么区别?
【发布时间】:2018-12-07 17:05:50
【问题描述】:

++*var++ 和 ++var++ 有什么区别? 为什么 ++*var++ 正在工作,而 ++var++ 在 C 中导致 lvalue required 错误?

【问题讨论】:

  • 你忽略了var的类型
  • 我看不出与提议的“重复”问题有任何相关性
  • 各位,这与排序点没什么关系。这里有两个对象被更改,而不是一个两次。我已经重新打开了。
  • @Senthilkumar 这两个表达式从何而来?您是否在实际程序中找到它们?他们是课堂作业的一部分吗?或者您是否正在尝试前缀++、后缀++* 的所有排列和组合,以确保您了解它们的作用?如果您正在尝试,我必须提醒您:许多组合(例如您询问的两种)非常无意义,以至于尝试它们不可能教给您任何有用的东西,它可能只会让您更加困惑。
  • 请不要写这样的代码。

标签: c post-increment pre-increment


【解决方案1】:

++var++ 被分组为++(var++),这会导致编译失败,因为var++ 不是lvalue。 (通俗地说,这意味着你不能把它放在作业的左边)。

++*var++ 被分组为++(*(var++)),这意味着使用指针算法将指针var 增加1,然后将var 的初始值的取消引用值增加1。

【解决方案2】:

尽管我只是在评论中建议不要这样做,但查看所有可能性可能会很有用。对于指针变量p,我们有:

  1. ++p             增加p,产生新值
  2. p++             增加p,产生旧值
  3. *++p           增加p,访问它新指向的内容
  4. *p++           增加p,访问它曾经指向的内容
  5. ++*p           增加p指向的内容,产生新的价值
  6. (*p)++        增加p指向的内容,产生旧值
  7. ++*++p        增加p,增加它新指向的东西,产生新的价值
  8. (*++p)++     增加p,增加它新指向的值,产生旧值
  9. ++(*p++)     增加p,增加它曾经指向的东西,产生新的价值
  10. (*p++)++     增加p,增加它曾经指向的东西,产生旧值
  11. ++p++          毫无意义

案例 9 和 11 是您要询问的案例。在案例 9 中,我添加了显式括号以更清楚地说明发生了什么。我想如果你把它们排除在外,然后说++*p++,它也可以工作,但这会让我头晕目眩,所以我不想再去想它了。

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多