我正在研究一个Linux代理程序而且我遇到了这个问题。这是我挣扎的代码。
while(n = Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0){
printf("%d\n", n);
Rio_writen_w(serverfd, buf, n);
}
这是' Rio_readlineb_w'
的包装功能ssize_t Rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen)
{
ssize_t rc;
if((rc = rio_readlineb(rp, usrbuf, maxlen)) < 0 )
printf("Rio_readlineb error");
printf("%d\n", rc);
return rc;
}
变量&#39; rc&#39;表示rio_readlineb函数读取的字符数。在包装函数中使用printf,我检查了rc正是读取的字符数。但是,变量&#39; n&#39;上面的while语句总是1.我无法找出错误。您是否认为返回值有所改变?
答案 0 :(得分:9)
这是运营商优先权问题。
while(n = Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0){
应该是:
while((n = Rio_readlineb_w(&rio_client, buf, MAXLINE)) > 0){
否则,您将比较结果(0或1)分配给n
。
答案 1 :(得分:1)
while(n = Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0){
printf("%d\n", n);
Rio_writen_w(serverfd, buf, n);
}
与:
相同while (n = /* assignment has low priority */
(Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0)
) {
printf("%d\n", n);
Rio_writen_w(serverfd, buf, n);
}
我怀疑你想要:
while ((n = Rio_readlineb_w(&rio_client, buf, MAXLINE)) > 0) {
printf("%d\n", n);
Rio_writen_w(serverfd, buf, n);
}
答案 2 :(得分:0)
n = Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0
被解析为
n = (Rio_readlineb_w(&rio_client, buf, MAXLINE) > 0)
由于=
的优先级低于>
,因此n
会得到比较结果,即0
或1
。您需要明确地对作业进行分组:
(n = Rio_readlineb_w(&rio_client, buf, MAXLINE)) > 0
就像在Rio_readlineb_w
函数中完成的一样。
赋值的优先级低于大多数其他运算符,因此在较大的表达式中使用赋值表达式时要小心。例如,
a = b && c;
将b && c
的结果分配给a
。如果您要将b
的结果分配给a
并将其与c
进行比较,那么您需要使用括号来表示:
(a = b) && c