【问题标题】:C difference between (++variable) and (variable++)(++variable) 和 (variable++) 之间的 C 区别
【发布时间】:2013-07-22 23:02:48
【问题描述】:

我这里有一些 C 代码:

char *cat_copy(char *dest, char *src)
{
    char *start = dest;

    while (*++dest);    //increment unless it can't anymore.

    while (*src++)
    {
        *dest = *(src - 1);
        dest++;
    }
    return start;
}

我必须使用while (*++dest) 来让它工作,而不是while (*dest++)

我读到:"--" operator in while ( ) loop,在我看来使用while (*dest++) 是有意义的。

为什么它不适用于*dest++?还有*dest++*++dest有什么区别。

【问题讨论】:

  • 在这个while循环中,据我所知,你想检查你是否仍然在字符串的范围内。如果你做dest++,它首先检查他现在所在的位置,然后将其加一,这可能会导致循环内部出现越界错误,但++dest首先增加字符串索引,然后检查它是否仍在边界内。 ..希望我能让你明白
  • 我想在两个循环完成后我最终得到同一个字符:'0',我试图记录 printf 到处发生的事情,两个版本都报告说在循环之后我们处于 char '0'所以我很困惑
  • 我认为当它是 dest++ 时,你不会以 '0' 结尾,而是在它“之后”一个字符,这是一个无效的内存空间(分段错误)
  • 继续增加,除非它不能了?如果没有,编译器会不会认为 while 循环下的行在 while 内?

标签: c loops syntax operators


【解决方案1】:
while (*++dest);

就像

do {
  dest++; // or ++dest
} while (*dest);

在哪里

while (*dest++);

就像

while (*dest) {
  dest++;
}
dest++;

你需要复制所有的chars,包括NUL字节。

使用while (*++dest);,您在取消引用之前递增dest。如果 first char 是 NUL 字节,你会错过它并在 on 上循环。

【讨论】:

  • 那么第二个字符太远了?
  • 好答案我赞成你,但我喜欢用句子解释得更好的答案!还是谢谢!
  • 邮政编码失败,因为它跳过了对第一个字节的测试。建议while (*src) { *dest++ = *src++; }; *dest = '\0';
  • +1 很好的解释,我不能投票,因为我已经超过了投票数。
  • @ItsASecret 有时最好的答案会在很多之后出现。
【解决方案2】:
while (*++dest);

这增加了dest,然后检查它是否指向字符串的终止空字节。在字符串的末尾,这将使dest 指向终止的空字节

while (*dest++);

这增加了dest,然后检查它是否确实指向终止的空值,在增加发生之前。在字符串的末尾,这将留下dest 指向字符之后 终止空。

由于在下面的复制部分你想覆盖dest的原始终止空值,第一个版本效果更好。

虽然第一个版本仍然存在错误。它总是至少增加一次dest,如果dest 以空字符串开头,这不是正确的做法。将*dest 检查与dest++ 增量分开会使循环更清晰并正确处理这种情况:

while (*dest)
   dest++;

【讨论】:

  • 非常感谢我现在完全理解了,你有什么建议让它完整,我先检查是否为空字符串?
猜你喜欢
  • 2012-10-27
  • 2013-03-28
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多