【问题标题】:why does *ptr++ act like *(ptr++) and not (*ptr)++? [duplicate]为什么 *ptr++ 表现得像 *(ptr++) 而不是 (*ptr)++? [复制]
【发布时间】:2011-06-07 20:10:51
【问题描述】:

可能重复:
++ on a dereferenced pointer in C?

同样,什么会 *ptr += 1 *ptr % 8, 和 *点 / 8 是吗?

这些差异似乎令人困惑。 这是否可能依赖于编译器?

【问题讨论】:

  • 为什么1 + 2 * 2 是 5 而不是 6?
  • 有趣的是,每个人都设法找到指向“运算符优先级”页面的不同链接。

标签: c


【解决方案1】:

它与运算符优先级有关。 * 运算符的优先级低于 ++,因此它出现在最后。

这是列出所有运算符的 Wikipedia 图表:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

您可以在图表中看到后缀 ++ 的优先级为 2,而 * 的取消引用的优先级为 3。(数字稍微向后,因为数字越小优先级越高)。

【讨论】:

    【解决方案2】:

    运算符优先级。 ++ 运算符比 * 运算符“绑定得更紧密”。

    这是表格,按优先顺序排列。 http://isthe.com/chongo/tech/comp/c/c-precedence.html

    这不依赖于编译器。它将始终以这种方式运行。

    【讨论】:

      【解决方案3】:

      因为优先级(这正是 C 的工作方式)。

      C FAQ on the * exact * subject

      后缀 ++ 和 -- 运算符 本质上具有更高的优先级 比前缀一元运算符。 因此,*p++ 等价于 *(p++);

      【讨论】:

        【解决方案4】:

        因为operator precedence

        后缀 ++ 的优先级高于 * 运算符。它不依赖于编译器。

        *ptr += 1 将 ptr 指向的值加一(或调用适当的重载运算符) *ptr % 8 将计算ptr指向的值除以8的余数 *ptr / 8 将计算ptr所指向的值与8的除法

        【讨论】:

          【解决方案5】:

          来自wikipedia

          对于 ISO C 1999 标准,第 6.5.6 节注释 71 指出规范提供的 C 语法定义了 C 运算符的优先级

          这意味着运算符优先级受 C 标准的约束。

          【讨论】:

            【解决方案6】:

            这些差异似乎令人困惑。这是否可能依赖于编译器?

            不,运算符的优先级在 c 语言规范中定义。 所以 *prt++ 总是在后增量发生之前延迟指针。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-05
              • 2013-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-24
              • 1970-01-01
              • 2023-04-11
              相关资源
              最近更新 更多