Всегда ли C оценивает все операторы, связанные с && или || - PullRequest
3 голосов
/ 01 апреля 2011

довольно простой вопрос, который у меня есть, но я не смог найти ответ:

Предположим, у меня есть условное предложение, состоящее из нескольких условий.Например, что-то вроде

  if((a == b && strcmp(string1, string)) || x <= 5)

Мой вопрос таков: будут ли оцениваться все эти утверждения, независимо от того, каков был результат первых, или остановится ли оценка, когда результат станет ясным.1007 * Поскольку я не уверен, ясен ли мой вопрос, вот пример:

  if(a == 5 || b > 12 || (c = someFun()) == 3)

В этом случае, если a == 5, дальнейшие проверки не потребуются, поскольку результат большого оператораэто правда, поэтому мы могли бы просто продолжить.Это будет означать, что someFun () не будет оцениваться.

Это так?Я знаю, что Java имеет значение здесь между && и & resp.||и |(последние в любом случае недоступны в C), но я не знаю, как C справляется с этим

Ответы [ 4 ]

14 голосов
/ 01 апреля 2011

Эти операторы закорачивают в C (и C ++).

5 голосов
/ 01 апреля 2011

C оценивает, пока не узнает ответ, поэтому:

EvalsToTrue () && EvalsToAnything () оценивает оба

EvalsToFalse () && EvalsToAnything () оценивает только первое

EvalsToTrue () ||EvalsToAnything () оценивает только первое

EvalsToFalse () ||EvalsToAnything () оценивает оба

1 голос
/ 01 апреля 2011

Левое выражение всегда вычисляется. Правое выражение вычисляется следующим образом:

  • a || b - b будет оцениваться, только если a оценивается как false
  • a && b - b будет оцениваться, только если a оценивается в true

&& имеет более высокий приоритет, чем ||, таким образом

  • a || b && c - b && c будет оцениваться, только если a оценивается как false
  • a && b || c - c будет оцениваться, только если a && b оценивается как false
  • (a || b) && c - c будет оцениваться, только если a || b оценивается в true
  • a && (b || c) - b || c будет оцениваться, только если a оценивается в true
  • a && b && c - c будет оцениваться, только если a && b оценивается в true
  • a || b || c - c будет оцениваться, только если a || b оценивается как false
0 голосов
/ 01 апреля 2011

Оценка начинается в крайнем левом углу .. и завершается, когда общее условие больше не действует.

...