C语言中*s++ = *t++ 是怎么一种赋值过程
如题 K&R 中的 一个strcpy函数中出现的方式
void strcpy(char *s, char *t)
{
while (*s++ = *t++);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如题 K&R 中的 一个strcpy函数中出现的方式
void strcpy(char *s, char *t)
{
while (*s++ = *t++);
}
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
首先是
然后判断整个表达式的值是否为真,即
满足,则继续循环,否则终止
不论循环继续与否,接下来要执行
=================================
回答评论中补充的问题,程序怎么读
优先级表我就不贴了,百度一大堆 ,核心是你要理解下面流程中的
5.2
*
,判断为指针运算符号,需要一个标示符或者表达式s
,是一个合法的标示符,继续搜索是否有更高优先级的运算符++
,由于*
与++
是同一优先级,结合性为右到左,所以等同于*(s++)
=
,判断为赋值运算符,优先级比++
低,因此前面的部分可以直接进行计算*(s++)
怎么计算?expr1 = s++; expr2 = *expr1;
expr1 = s++
,后置++
的含义是先使用变量/表达式的值、再自增,表达式s++
的计算结果就是s
的值,计算完毕后,s
自增1,也就是说假如s = 1
,那么s++
这个表达式
的计算结果就是1
,expr1 = 1
,计算完毕后,s
的值自增1变为2
,但不影响之前已经计算完毕的表达式expr2 = *expr1
,按照上面所举的例子,此时s=2
,expr2 = *1
=
的计算,由于赋值运算符是双目运算,需要一个右目表达式,继续解析*
的优先级比=
高,因此先计算*t++
,原理同上a=b
的值就是b
非0
看一下对应指令
可以看到,先*s = *t,然后s和t各自加1
首先,楼主while里面是不是少了一个=号
其次 这个是运算符优先级的问题:++ > * > ==:
大体相当于下面的:
这个是csdn上一个老问题吧:http://bbs.csdn.net/topics/330083449
我觉得里面9楼的就说得很详细了,对比一下很清晰。
以下来源《C程序设计现代方法》