Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays while(*s=*t)!=&x2019;\0&&x2019;)是什么意思?_Arrays_C_Pointers - Fatal编程技术网

Arrays while(*s=*t)!=&x2019;\0&&x2019;)是什么意思?

Arrays while(*s=*t)!=&x2019;\0&&x2019;)是什么意思?,arrays,c,pointers,Arrays,C,Pointers,我在这里读到K&R书中的指针 然后,解释strcpy的确切功能: /* strcpy: copy t to s; pointer version */ void strcpy(char *s, char *t) { while ((*s = *t) != ’\0’) { s++; t++; } } 但是我无法理解((*s=*t)!='\0')中有两个()的行 我学到的是将其用作:while(condition) 实际上,有一个赋值,后面是一个比较: *s=*t;//复

我在这里读到K&R书中的指针

然后,解释strcpy的确切功能:

/* strcpy: copy t to s; pointer version */
void strcpy(char *s, char *t) {
  while ((*s = *t) != ’\0’) {
    s++;
    t++;
  }
}
但是我无法理解((*s=*t)!='\0')中有两个()的行

我学到的是将其用作:
while(condition)

实际上,有一个赋值,后面是一个比较:

  • *s=*t;//复制字符串s中的字符*t
  • 如果循环结束,则将此字符的值与
    \0
    进行比较
  • 为了减少代码行数,他们将所有代码都放在一行中

    实际上,有一个赋值,后面是一个比较:

  • *s=*t;//复制字符串s中的字符*t
  • 如果循环结束,则将此字符的值与
    \0
    进行比较

  • 为了减少代码行数,他们将所有代码都放在一行中。

    这是一种非常密集的编写方式:

    void strcpy(char*s,char*t){
    while(true){
    //问题中循环中的条件
    *s=*t;
    如果(*s=='\0)
    打破
    //你问题中的主体
    s++;
    t++;
    }
    }
    
    K&R书中较短的(代码行)版本有效,因为表达式
    (*s=*t
    )有两个作用:

  • 它将
    *t
    中的值分配给
    *s
  • 表达式
    (*s=*t)
    的值为
    *t

  • 因此,如果
    *t='\0'

    *t
    分配给
    *s
    后,我们可以使用它来打破循环。这是一种非常密集的书写方式:

    void strcpy(char*s,char*t){
    while(true){
    //问题中循环中的条件
    *s=*t;
    如果(*s=='\0)
    打破
    //你问题中的主体
    s++;
    t++;
    }
    }
    
    K&R书中较短的(代码行)版本有效,因为表达式
    (*s=*t
    )有两个作用:

  • 它将
    *t
    中的值分配给
    *s
  • 表达式
    (*s=*t)
    的值为
    *t


  • 因此,在将
    *t
    赋值给
    *s
    后,如果
    *t='\0'

    提示:请仔细阅读
    =
    运算符的作用。@NateEldredge a=b表示在a@wadieel:它还能做一件事。你见过像
    a=b=0,它将0分配给
    a
    b
    ?你能理解它是怎么做到的吗?@JerryCoffin我能直观地理解它,但在我们的例子中,我们有(a=b)=0需要记住的是像
    a=b
    这样的赋值是一个表达式,它的类型和值是
    a
    的类型和新值。因此,它首先执行赋值,然后在比较中使用赋值表达式的值。提示:请仔细阅读
    =
    运算符的操作。@NateEldredge a=b表示在a@wadieel:它还能做一件事。你见过像
    a=b=0,它将0分配给
    a
    b
    ?你能理解它是怎么做到的吗?@JerryCoffin我能直观地理解它,但在我们的例子中,我们有(a=b)=0需要记住的是像
    a=b
    这样的赋值是一个表达式,它的类型和值是
    a
    的类型和新值。所以它首先执行赋值,然后在比较中使用赋值表达式的值。矫揉造作?你肯定不是这个意思。“任务”也许?做作?你肯定不是这个意思。也许是“赋值”吧?我不明白(*s=*t)和*s=*t之间的区别,是一样的吗?那么为什么(*s=*t)的值为*t?实际上它的类型和新值为
    *s
    ,这不一定与
    *t
    相同。在本例中,它们是相同的,但如果
    *s
    *t
    有不同的类型,则不是这样。@wadieel-括号是必需的,因为
    =
    的优先级低于
    ==
    ,因此
    *s=*t='\0'
    将被解析为
    *s=(*t='\0')
    ,更改表达式的含义。我不明白(*s=*t)和*s=*t之间的区别,是相同的吗?那么为什么(*s=*t)的值为*t?实际上它的类型和新值为
    *s
    ,这不一定与
    *t
    相同。在本例中,它们是相同的,但如果
    *s
    *t
    有不同的类型,则不是这样。@wadieel-括号是必需的,因为
    =
    的优先级低于
    ==
    ,因此
    *s=*t='\0'
    将被解析为
    *s=(*t='\0')
    ,从而更改表达式的含义。
    while ((*s = *t) != ’\0’)