Arrays while(*s=*t)!=&x2019;\0&&x2019;)是什么意思?
我在这里读到K&R书中的指针 然后,解释strcpy的确切功能: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;//复
/* 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’)