为什么返回变量的值会发生变化?

时间:2015-06-23 14:01:44

标签: c return

我正在研究一个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.我无法找出错误。您是否认为返回值有所改变?

3 个答案:

答案 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会得到比较结果,即01。您需要明确地对作业进行分组:

(n = Rio_readlineb_w(&rio_client, buf, MAXLINE)) > 0

就像在Rio_readlineb_w函数中完成的一样。

赋值的优先级低于大多数其他运算符,因此在较大的表达式中使用赋值表达式时要小心。例如,

a = b && c;

b && c的结果分配给a。如果您要将b的结果分配给a并将其与c进行比较,那么您需要使用括号来表示:

(a = b) && c