Приоритет операторов 'или' и 'и' в C - PullRequest
0 голосов
/ 27 мая 2019

В следующем коде я получаю 10 | 1 | 1 в результате. Но в соответствии с правилами приоритета оператор 'и' не должен быть оценен первым? (И выдает c = 9) (--b) && (- c), поскольку 'и' имеет более высокий приоритет. (или ярлык нарушает правила приоритета?) Заранее спасибо.

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a,b,c,d;
    a =1;
    b = c = 10;
    d = a|| --b&&--c;
    printf("%d\n",c);
    printf("%d\n",a);
    printf("%d\n",d);
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 27 мая 2019

Старшинство и порядок оценки - это две разные вещи.Из логической ИЛИ документации (выделено мое):

После оценки lhs есть точка последовательности .Если результат lhs сравнивается не равным нулю, тогда rhs вообще не оценивается (так называемая оценка короткого замыкания).

В случае exp1 || exp2, exp1 всегда оценивается первымпоскольку после нее есть точка последовательности, и если exp1 не равен нулю, то exp2 не оценивается.

2 голосов
/ 27 мая 2019

Приоритет только определяет, какие операнды с какими группами сгруппированы - он не контролирует порядок, в котором вычисляются выражения.

В вашем примере это означает, что выражение анализируется как

a || (––b && ––c)

Обе || и && оценка слева направо 1 . Оба вводят точку последовательности (IOW, левый операнд будет оценен, и все побочные эффекты будут применены до того, как правый операнд будет оценен).

Оба оператора короткое замыкание - если левый операнд || оценивается как ненулевой, то результатом выражения будет 1 (истина) независимо от значения правого операнда, поэтому правый операнд вообще не оценивается. Если левый операнд && равен 0, то результатом выражения будет 0 (ложь) независимо от значения правого операнда, поэтому правый операнд вообще не оценивается.

В вашем выражении a вычисляется первым. Он имеет ненулевое значение (1), поэтому ––b && ––c не оценивается.


Вместе с ?: и запятыми. Все остальные операторы (арифметика, равенство, индекс и т. Д.) Не предписывают определенный порядок вычисления.
...