Как оценить эти вызовы fork() с помощью && и || операторов в C?

У меня есть некоторый код в C, который использует системный вызов fork(), но я просто смущен: как мне заняться решая, что он делает:

int main()
{
    fork();
    fork() || fork() && fork();
    fork();
    printf("ämit");
}

fork() && fork() || fork(); оценивается следующее:

       fork()
      /      \
    0/        \>0
 || fork()     && fork()
     /\            /   \
    /  \         0/     \>0
   *    *     || fork()  *
                /   \
               *     *

Мне нужно такое же дерево для fork() || fork() && fork(). Может ли кто-нибудь сказать мне, как я должен это достичь?

Ответы

Ответ 1

|| имеет более низкий приоритет, чем &&, и те операторы короткого замыкания после оценки первого операнда, если он содержит достаточные данные (|| коротких замыканий, если первый операнд истинен и && коротких замыканий если первый операнд ложный).

fork()||fork()&&fork() эквивалентен fork() || ( fork() && fork() )

Таким образом:

                                                       fork()
                                                     0/     \>0
                                                     /       *  ==> || short-circuits, no evaluation of  fork()&&fork()
                                                   fork()
                                                   0/    \>0
 && short-circuits, no evaluation of &&fork() ==>  *     fork()
                                                         /   \
                                                        *     *

Для первого примера это эквивалентно ( fork() && fork() ) || fork().

Ответ 2

Если это вопрос интервью (вероятно) или домашнее задание (немного менее вероятно), вы сначала спокойно объясните, как вы могли его оценить.

Под этим я подразумеваю, что вы утверждаете, что первая, вторая и пятая вилки безусловны, а третья и четвертая зависят от второго и третьего (и что эти второй и третий будут выполняться в нескольких процессах).

Это покажет, что вы понимаете понятия.

Затем вы объясните, что это не имеет большого значения, потому что, если какой-либо кодер действительно предоставил вам такой код, произойдет какое-то серьезное действие tar'n'feather. Код, подобный этому чудовищу, не имеет места в реальном мире и, хотя он хорош для проверки вашего понимания, вы никогда не столкнетесь с ним на самом деле.