【问题标题】:Does the pointer get assigned first or the incremented?指针是先分配还是递增?
【发布时间】:2016-02-10 03:31:37
【问题描述】:

当你有声明时:

*str++ = *end

*str 是被分配了*end 的值,还是被增加了然后被分配了*end 的值?

【问题讨论】:

  • *(++str) = *end 会做什么?
  • @iharob:大括号是不必要的。
  • ++ 的优先级高于* 的优先级,所以*str++*(str++) 相同。
  • @JonathonReinhart 我觉得这个问题有用的是在左侧表达式上使用后增量。 OP 寻求明确分配操作是发生在 any 左侧递增/递减之前还是之后。指针是最明显的左侧用例。
  • @lurker 有效点。我今天没喝咖啡。但我不喝咖啡,所以这可能是个问题!

标签: c pointers increment


【解决方案1】:

作为后自增运算符,它首先分配*end,然后指向str的新/自增地址。

【讨论】:

  • 这是 C 语言中唯一的后自增运算符吗?
  • 是的,这是唯一的后自增运算符,不仅在 c 中,在 c++、java、javascript 中。
  • 操作数前后的--也是如此
  • @SharanDuggirala 它显然是 C 中唯一的 post increment 运算符(为什么同一件事会有多个运算符)但还有其他 postfix 运算符,例如[ ].->--
【解决方案2】:

逻辑上,表达式的计算结果如下:

t0 = str;
t1 = *end;
str = str + 1;
*t0 = t1;

除了这些操作发生的确切顺序是未指定。以下序列也是可能的:

t0 = str;
str = str + 1;
t1 = *end;
*t0 = t1;

t0 = *end;
t1 = str;
*t1 = t0;
str = str + 1;

t0 = *end;
t1 = str;
str = str + 1;
*t1 = t0;

一个常量是我们正在更新str 指向的位置增量之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 2018-12-07
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多