【问题标题】:Copy character using pointers with post-increment使用具有后增量的指针复制字符
【发布时间】:2015-02-12 03:16:55
【问题描述】:

最近我一直在学习 C 和指针。

在 Stephen G. Kochan 的《Programming in C》一书中,我遇到了一个我很难完全理解的例子。

使用指针将字符串from复制到字符串to,示例说明:


void copyString (char *to, char *from) {
    while ( *from ) 
         *to++ = *from++;

    *to = '\0'; 
}

在我的理解中,*from++*from 的后增量;因此*to++ 的值应仅为*from

例如,如果

`*from` is in the position 1.

`*from++` is in position 2

`*to++` in position 2, 

但是:*from++ = *to++ 应该将 *from 的值返回为 *to 位置 1,而不是 2。

编译器说是位置2,书上也说是位置2。

我在这里有点困惑。你对这个案例有什么可行的解释吗?

【问题讨论】:

  • 相当于:*to = *from; to++; from++; - 太可怕了,不是吗?
  • K&R 方法更短:while (*to++ = *from++) {;}

标签: c pointers post-increment


【解决方案1】:

当使用后缀++ 一元运算符时,递增在计算操作数的值之后进行排序。所以表达式等价于:

*to = *from;
to++ ;
from++ ;

在你的例子中:*to++ = *from++;,得到*to*from的值,然后将*from的值赋值给*to,然后两个指针都递增。

【讨论】:

    【解决方案2】:

    *to++ = *from++; tofrom 都有后增量。

    你可以读起来,

    1. *from的包含复制到*to
    2. 增加tofrom

    一旦赋值运算符= 的求值完成,后缀运算符就会被求值,并执行递增(递减)操作。因此,首先复制值,然后增加两个指针。

    【讨论】:

    • 谢谢。我读到这样的东西:1. *from 的增量 2. 将值从 *to 传递到 *from1 3. *to 的增量
    • @ctn 不,这不是顺序。两个指针将同时递增。
    • "一旦赋值运算符 = 完成评估,就会评估后缀运算符。" 这是不正确的。评估 postifx 运算符的结果是操作数。递增操作数是评估的副作用,并且在对操作数进行计算之后进行排序。请参阅 C11 标准 6.5.2.4/2 以及 2501 的答案:stackoverflow.com/a/27460162/694576
    • @alk 我的错。选词不当。现在是正确的吗?
    【解决方案3】:

    作为对先前答案的补充。

    在 C 中,后缀自增 ++ 的优先级高于解引用运算符 *,这意味着 *ptr++ 等价于 *(ptr++)。查看this 了解有关 C 运算符优先级的更多信息。

    【讨论】:

    • 请问哪个“previous anwser”?
    • @alk。之前的所有答案都以简单的方式解释了*from++ 的作用。我试图以一种非常抽象的方式来解释它(我的意思是运算符优先级)。
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多