Рубрики

Приоритет оператора и ассоциативность в C

Приоритет оператора определяет, какой оператор выполняется первым в выражении с несколькими операторами с различным приоритетом.

Например: решить

10 + 20 * 30

10 + 20 * 30 is calculated as 10 + (20 * 30)
and not as (10 + 20) * 30

Ассоциативность операторов используется, когда в выражении появляются два оператора с одинаковым приоритетом. Ассоциативность может быть либо L EFT т о R или R РАВО РАВ т о л EFT.

Например: «*» и «/» имеют одинаковый приоритет и их ассоциативность л EFT т о Р РАВО, поэтому выражение «100/10 * 10» трактуется как «(100/10) * 10».

Operators Precedence and Associativity are two characteristics of operators that determine the evaluation order of sub-expressions in absence of brackets

Например: решить

100 + 200 / 10 - 3 * 10

1) Ассоциативность используется только тогда, когда есть два или более операторов с одинаковым приоритетом.
Следует отметить, что ассоциативность не определяет порядок, в котором оцениваются операнды одного оператора. Например, рассмотрим следующую программу, ассоциативность оператора + слева направо, но это не значит, что f1 () всегда вызывается перед f2 (). Вывод следующей программы фактически зависит от компилятора. Смотрите это для деталей.

// Ассоциативность не используется в приведенной ниже программе.
// Вывод зависит от компилятора.

  
#include <stdio.h>

  

int x = 0;

int f1()

{

    x = 5;

    return x;

}

int f2() 

{

    x = 10;

    return x;

}

int main()

{

    int p = f1() + f2();

    printf("%d ", x);

    return 0;

}

2) Все операторы с одинаковым приоритетом имеют одинаковую ассоциативность
Это необходимо, иначе у компилятора не будет никакого способа решить порядок вычисления выражений, которые имеют два оператора с одинаковым приоритетом и разной ассоциативностью. Например, + и — имеют одинаковую ассоциативность.

3) Приоритет и ассоциативность postfix ++ и prefix ++ различны
Приоритет postfix ++ больше, чем префикса ++, их ассоциативность также отличается. Ассоциативность postfix ++ слева направо, а ассоциативность префикса ++ справа налево. Смотрите это для примера.

4) Запятая имеет наименьший приоритет среди всех операторов и должна использоваться осторожно. Например, рассмотрим следующую программу, результат равен 1. Смотрите это и это для более подробной информации.

#include <stdio.h>

int main()

{

    int a;

    a = 1, 2, 3; // Оценивается как (a = 1), 2, 3

    printf("%d", a);

    return 0;

}

5) нет цепочки операторов сравнения в C
В Python выражение типа «c> b> a» обрабатывается как «c> b и b> a», но такого типа сцепления не происходит в C. Например, рассмотрим следующую программу. Выход следующей программы — «ЛОЖЬ».

#include <stdio.h>

int main()

{

    int a = 10, b = 20, c = 30;

  

    // (c> b> a) трактуется как ((c> b)> a), ассоциативность '>'

    // слева направо. Поэтому значение становится ((30> 20)> 10)

    // который становится (1> 20)

    if (c > b > a)

        printf("TRUE");

    else

        printf("FALSE");

    return 0;

}

Пожалуйста, смотрите следующую таблицу приоритетов и ассоциативности для справки.

 

 

Operator

Description 

Associativity

( )
[ ]
.
->
++ —
Parentheses (function call) (see Note 1)
Brackets (array subscript)
Member selection via object name
Member selection via pointer
Postfix increment/decrement (see Note 2)

left-to-right

++ —
+ –
! ~
()
*
&
sizeof
Prefix increment/decrement
Unary plus/minus
Logical negation/bitwise complement
Cast (convert value to temporary value of )
Dereference
Address (of operand)
Determine size in bytes on this implementation
right-to-left
*  /  %Multiplication/division/modulusleft-to-right
+  –Addition/subtractionleft-to-right
<<  >>Bitwise shift left, Bitwise shift rightleft-to-right
<  <=
>  >=
Relational less than/less than or equal to
Relational greater than/greater  than or equal to
left-to-right
==  !=Relational is equal to/is not equal toleft-to-right
&Bitwise ANDleft-to-right
^Bitwise exclusive ORleft-to-right
|Bitwise inclusive ORleft-to-right
&&Logical ANDleft-to-right
| |Logical ORleft-to-right
? :Ternary conditionalright-to-left
=
+=  -=
*=  /=
%=  &=
^=  |=
<<=  >>=
Assignment
Addition/subtraction assignment
Multiplication/division assignment
Modulus/bitwise AND assignment
Bitwise exclusive/inclusive OR assignment
Bitwise shift left/right assignment
right-to-left

,

Comma (separate expressions)left-to-right

Хорошо знать правила приоритета и ассоциативности, но лучше всего использовать скобки, особенно для менее часто используемых операторов (операторов, отличных от +, -, * .. и т. Д.). Скобки повышают удобочитаемость кода, поскольку читателю не нужно просматривать таблицу, чтобы узнать порядок.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Приоритет оператора и ассоциативность в C

0.00 (0%) 0 votes