Precedenţa şi asociativitatea operatorilor
Limbajul C este unul dintre cele mai complexe limbaje când vine vorba de precedenţa operatorilor. Exista 15 de nivele diferite de precendenţă .
Precendenţa se referă la ordinea de evaluare a expresiilor şi depinde de doua lucruri:
- Operatorii au nivele de precendeţă diferite.
- Operatorii au asociativitate diferită de stânga sau de dreapta.
Operator | Associativity |
( ) [ ] -> . ++’postfix’ --’postfix’ | Left |
! ˜ ++ -- + - (type) * & sizeof | Right |
* / % | Left |
+’binary’ -’binary’ | Left |
<< >> | Left |
< <= > >= | Left |
== != | Left |
& | Left |
ˆ | Left |
| | Left |
&& | Left |
|| | Left |
?: | Right |
assignments | Right |
, | Left |
Exemplu:
Rezultat:
Regula de bază pentru a evita problemele este :
Fiecare subexpresie a unei expresii mai complicate ar trebui flancată de parenteze.Exemplu:
MISRA
E bine să ne bazăm şi pe cele două reguli MISRA:MISRA-C:2004, Rule 12.1: Limited dependence should be placed on C’s operator precedence rules in expressions
MISRA-C:2004, Rule 12.2: The value of an expression shall be the same under any order of evaluation that the standard permits
Nu uitaţi , Keep It Simple!