Как мне оценить эти вызовы 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. Коду, подобному этому чудовищу, нет места в реальном мире, и, хотя он полезен для проверки вашего понимания, вы никогда не встретите его в реальности.