2014-02-17 3 views
3

Рассмотрим это:Логические операторы сравнения без управляющих операторов

main() 
    { 
     int i = 1; 
     fork(); fork(); fork(); 
     printf("%d ",i); 
    } 

Выход выше код:

1 1 1 1 1 1 1 1 

То есть, в конце есть 8 (2^3) процессы достижения линия printf(). Теперь рассмотрим следующий код:

main() 
    { 
     int i = 1; 
     fork() && fork() || fork(); 
     printf("%d ",i); 
    } 

Первоначально я думал, что не было бы никакого изменения в звучании, так как результаты сравнения с помощью &&, || не оцениваются с помощью управляющего заявления как if или while. То есть, их отбрасывают. Однако Выходной сигнал этого кода:

1 1 1 1 1 

Значение, в конце есть 5 процессов, которые достигают printf() линии.

Мой вопрос: Что делает эта линия делать

fork() && fork()||fork(); 

Определенно, что-то изменилось. Я никогда не рассматривал использование операторов сравнения, таких как &&, || без контрольных операторов, таких как if, while для оценки результата сравнения и, соответственно, принятия некоторых мер. Я думал, что без этих контрольных конструкций операторы сравнения не имеют смысла; они просто вернут 1 или 0 без каких-либо действий.

Очевидно, я ошибаюсь и совершенно не подозреваю об этом использовании операторов.

+3

Возможно, хороший код будет хорошим началом –

+0

@EdHeal Это была головоломка. –

+0

Я не вижу, как это дубликат. Вопрос не в fork(). Как выясняется, речь идет о чем-то называемом «коротком замыкании операторов». Человек, который никогда не слышал об этом термине раньше, не может посмотреть это (это так, на этот раз) –

ответ

3

fork() возвращает PID для дочернего процесса, если он возвращается родительскому лицу, или 0, если он возвращается ребенку. Логические операторы короткого замыкания на С, поэтому a && b не оценивает b, если это a0 и a || b не оценивает b, если a не 0.

Так что вы вилкой один раз. Два процесса. Правая сторона && оценивается только у ребенка. Три процесса. Правая сторона || снова оценивается у одного и того же ребенка. Четыре процесса. Но ждать! && связывает более жесткие, чем ||, поэтому родительский процесс также вилки снова, в общей сложности пять процессов.

1

Несмотря на то, что это не является частью условной проверки, следующее утверждение:

exp1 && exp2 || exp3; 

бы еще оценить на логических правил оценки выражения. В этом случае, если exp1 является ложным (0), то exp2 будет пропущен, так как exp1 && exp2 уже определено как ложное. И если exp1 && exp2 истинно (не 0), то exp3 будет пропущен, так как тогда все выражение уже определено как истина.

Смежные вопросы