2015-01-21 2 views
-1

Я уже закодировал аналогичную функцию, это вызов 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); 

Что делает? " и «:» означает? Означает ли это, что условие до '?' return res или NULL?

Это довольно большой вопрос, но спасибо за вашу помощь в любом случае.

PS: Значение READ_MAX равно 5 в файле заголовка.

+2

Звучит разумно. Я тоже этого не понимаю, это оружие. –

+0

Я бы не сказал «на удивление легко», его очень трудно прочитать, полностью раскоментировано, а структура кода почти полностью скрыта. Попытайтесь начать с этого кода, а затем немного упростите его, выполнив только одну операцию на строку кода. Надеюсь, структура выскочит. – Gauthier

+0

Функция 'my_length()' вызывается слишком часто, ИМХО. Что оно делает ? – wildplasser

ответ

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; 
1
What does the '?' and ':' mean? 

Это называется Ternary operator в C. Примером может служить здесь,

result = a > b ? x : y; 

эквивалентно,

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

Теперь о том, чтобы вы понимаете код размещен, большинство, если это стандартные вызовы функций, таких как read(), malloc(), realloc(), sizeof(), строка окончание с \0 и т. д., я предлагаю пройти через каждую строку по одному, действительно поможет вам в обучении.

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); 
} 
Смежные вопросы