我不明白这段代码背后的逻辑

时间:2015-01-21 11:03:54

标签: c

我已经编写了一个类似的函数,它调用get_next_line,并在每次调用时返回一个字符串到当前行。但是我发现有人做得非常容易,完全无法理解他的代码。我很乐意帮助你们。

char *get_next_line(const int fd)
{
  static int    last = 1;
  static int    rd = 0;
  static int    i = 0;
  static char   *res = NULL;
  static char   buff[READ_MAX];

  if (buff[my_length(buff) - rd] == '\0')
    {
      if ((rd = read(fd, buff, READ_MAX)) <= 0)
        return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
      buff[rd] = '\0';
    }
  if ((res = (i == 0) ? malloc(sizeof(*res) * READ_MAX + 1) :
       my_realloc(res, sizeof(*res) * READ_MAX + 1)) == NULL)
    return (NULL);
  while (buff[my_length(buff) - rd] && buff[my_length(buff) - rd] != '\n')
    res[i++] = buff[my_length(buff) - rd--];
  res[i] = '\0';
  if (buff[my_length(buff) - rd] == '\n')
    {
      i = 0;
      rd--;
      return (res);
    }
  return (get_next_line(fd));
}

例如,我不明白:

return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);

&#39;是什么?&#39;和&#39;:&#39;意思?是否适用于之前的情况?&#39;返回res还是NULL?

这是一个相当大的问题,但感谢您的帮助。

PS:头文件中READ_MAX的值为5。

3 个答案:

答案 0 :(得分:1)

What does the '?' and ':' mean? 

这在C中称为Ternary operator。这里有一个例子,

result = a > b ? x : y;

相当于,

if (a > b) {
  result = x;
} else {
  result = y;
}

现在关于让您理解发布的代码,大多数是标准函数调用,例如read()malloc()realloc()sizeof(),字符串终止{{1} 1}}等等,我建议逐一浏览每一行真的会帮助你学习。

答案 1 :(得分:0)

return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);

此处?:是三元运算符。如果?之前的表达式变为TRUE,则?之后的值立即执行,否则:执行后的后一个值。

这与

相同
if((last--) && (buff[my_length(buff) - rd - 1] != 10))
{
   res = res;
}
else
{
   res = NULL;
}
return res;

答案 2 :(得分:0)

这是三元运算符。请参阅此link

( if the condition is true)?it will execute:or else it will execute;

在这种情况下

(res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);

如果条件(res = (last-- && buff[my_length(buff) - rd - 1] != 10)为真,则res将返回。如果条件为假,则NULL将返回。

等于此。

if ( (res = (last-- && buff[my_length(buff) - rd - 1] ) != 10 )
{
     return (res=res);
}
else 
{
     return (res=NULL);
}