Как мне оценить эти вызовы 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(), Может кто-нибудь сказать мне, как я должен достичь этого?

2 ответа

Решение

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

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(),

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

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

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

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

Другие вопросы по тегам