【问题标题】:'\0' related issue'\0' 相关问题
【发布时间】:2008-10-29 14:54:17
【问题描述】:

看看这个将一个 c-string 复制到另一个的循环:

void strcpyr(char *s, char *t)
{
    while(*s++=*t++)// Why does this work?
        ;
}

为什么我们不在 while 循环中检查 '\0' 字符,像这样?

while((*s++=*r++)!='\0')..

第一个循环如何终止?

【问题讨论】:

  • 请阅读有关降价以及如何在您的问题中输入代码的信息。基本上,在每行代码之前放置四个空格。
  • 标记的作业,可能有点苛刻?
  • 公共服务:像这样复制字符串是不安全的(没有边界检查)。任何“严肃”或“生产”代码都应该(通常)使用更安全的方法。就个人而言,我认为代码类型也更加努力变得聪明。

标签: c++ string


【解决方案1】:

语句 *s++=*t++ 不仅将下一个字符从 t 分配给 s,而且还返回 *t 的当前值作为表达式的结果。 while 循环终止于任何错误值,包括 '\0'。

这样想。如果你这样做了:

char c = *s++ = *t++;

除了将一个字符从 *t 复制到 *s 并递增两者之外,它还将 c 设置为 *t 的当前值。

【讨论】:

    【解决方案2】:

    当我们在t 最初指向的字符串中点击'\0' 时,执行赋值的*s++=*t++ 也会返回分配给s 或@987654325 指向的位置的值@,计算结果为 false 并终止循环。

    在您的第二个示例中,您明确依赖于赋值返回分配的字符这一事实,而第一个示例隐含地使用了这一事实(以及0 字符(也写为'\0')被认为是为假,而所有其他字符的计算结果为真,因此表达式c != '\0' 将产生与c 相同的结果。

    【讨论】:

      【解决方案3】:

      循环将终止,因为 '\0' 实际上是 0,并且“while” 所评估的不是相等测试 (==) 的结果,而是赋值表达式的右值.

      【讨论】:

        【解决方案4】:

        我们没有显式检查零的原因是在 C 中 0 是假的。

        因此循环

        while(*s++=*t++)
        ;
        

        将在 t 指向的字符为 0 时终止。

        -亚当

        【讨论】:

          【解决方案5】:

          我想你的意思是这样写:

          void strcpyr(char *s, char *t) {
            while (*s++ = *t++);
          }
          

          当“t”指向的值为零时,循环终止。对于 C(和 C++)循环和条件,任何非零整数都为真。

          【讨论】:

            【解决方案6】:

            while 循环正在测试赋值的结果。 赋值的结果是赋值给语句左侧的值。在最后一次迭代中,当 *t == '\0' 时,'\0' 被分配给 s,这成为 while 循环在决定是时候退出之前考虑的值。

            【讨论】:

              【解决方案7】:

              在 C 中,a=b 实际上是一个表达式,它被评估为 'b'。写起来比较容易:

              如果(a=b){ //一些块 }

              然后:

              a=b; 如果(一!= 0){ //一些块 }

              在 C 语言中,在 if、while、for 语句中进行的检查是:表达式不为零吗?

              【讨论】:

                猜你喜欢
                • 2011-07-31
                • 2013-01-09
                • 2012-02-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多