En los lenguajes de programación , las calculadoras científicas y la notación de operador común similar o la gramática de operador es una forma de definir y analizar expresiones matemáticas y otras expresiones formales. En este modelo, una secuencia lineal de tokens se divide en dos clases: operadores y operandos.
Los operandos son objetos sobre los que operan los operadores. Estos incluyen números literales y otras constantes, así como identificadores (nombres) que pueden representar cualquier cosa, desde simples variables escalares hasta complejas estructuras y objetos agregados, dependiendo de la complejidad y capacidad del lenguaje en cuestión, así como del contexto de uso. Un tipo especial de operando es el grupo de paréntesis. Una expresión encerrada entre paréntesis normalmente se evalúa de forma recursiva para ser tratada como un solo operando en el siguiente nivel de evaluación.
A cada operador se le asigna una posición, precedencia y asociatividad. La precedencia del operador es un número (de mayor a menor o viceversa) que define qué operador toma un operando que está rodeado por dos operadores de diferente precedencia (o prioridad). La multiplicación normalmente tiene mayor precedencia que la suma, [1] por ejemplo, entonces 3 + 4 × 5 = 3+ (4 × 5) ≠ (3 + 4) × 5.
En términos de posición de operador, un operador puede ser prefijo, sufijo o infijo. Un operador de prefijo precede inmediatamente a su operando, como en −x. Un operador de sufijo sucede inmediatamente a su operando, como en x! por ejemplo. Un operador infijo se coloca entre un operando izquierdo y uno derecho, como en x + y. Algunos lenguajes, sobre todo la familia de sintaxis C, amplían esta terminología convencional y también hablan de operadores infijos ternarios (a? B: c). En teoría, incluso sería posible (pero no necesariamente práctico) definir el entre paréntesis como una operación unaria bifix.
Asociatividad del operador
Asociatividad de operadores determina lo que sucede cuando un operando está rodeado por los operadores con la misma precedencia, como en 1-2-3: Un operador puede asociativo por la izquierda , derecha asociativo o no asociativo . Los operadores asociativos por la izquierda se aplican a los operandos en orden de izquierda a derecha, mientras que los operadores asociativos por la derecha son al revés. Los operadores aritméticos básicos son normalmente todos asociativos por la izquierda, [1] lo que significa que 1-2-3 = (1-2) -3 ≠ 1- (2-3), por ejemplo. Esto no es cierto para los operadores superiores. Por ejemplo, la exponenciación es normalmente asociativa a la derecha en matemáticas, [1] pero se implementa como asociativa a la izquierda en algunas aplicaciones informáticas como Excel. En los lenguajes de programación donde la asignación se implementa como un operador, ese operador suele ser asociativo por la derecha. Si es así, una declaración como a: = b: = c sería equivalente a a: = (b: = c) , lo que significa que el valor de c se copia en b, que luego se copia en a. Un operador que no es asociativo no puede competir por operandos con operadores de igual precedencia. En Prolog, por ejemplo, el operador infijo : - no es asociativo, por lo que construcciones como a: - b: - c son errores de sintaxis. Los operadores de prefijo unario como - (negación) o sin (función trigonométrica) son normalmente operadores de prefijo asociativos. Cuando más de un prefijo asociativo o operador de sufijo de igual precedencia precede o sucede a un operando, los operadores más cercanos al operando van primero. Entonces −sin x = - (sin x) y sin -x = sin (-x).
Los lenguajes de orientación matemática (como en calculadoras científicas ) a veces permiten la multiplicación implícita con mayor prioridad que los operadores de prefijo (como sin), de modo que sin 2x + 1 = (sin (2x)) + 1, por ejemplo. [ cita requerida ]
Sin embargo, los operadores de prefijo (y sufijo) no necesariamente tienen mayor precedencia que todos los operadores de infijo. Algunos lenguajes de programación (hipotéticos) pueden tener un operador llamado sin con una precedencia menor que × pero mayor que +, por ejemplo. En tal lenguaje, sin 2 · x + 1 = sin (2 · x) +1 sería verdadero, en lugar de (sin 2) · x + 1, como normalmente sería el caso.
Las reglas para la evaluación de expresiones suelen ser triples:
- Trate cualquier subexpresión entre paréntesis como un solo operando evaluado de forma recursiva (sin embargo, puede haber diferentes tipos de paréntesis, con diferente semántica).
- Vincular operandos a operadores de mayor precedencia antes que a los de menor precedencia.
- Para obtener la misma precedencia, vincule operandos a operadores de acuerdo con la asociatividad de los operadores.
Algunos ejemplos más:
- 1-2 + 3/4 * 5 + 6 + 7 = (((1-2) + ((3/4) * 5)) + 6) +7
- 4 + -x + 3 = (4 + (-x)) + 3
Generalizaciones de la notación de operador común
El uso de clases de precedencia de operadores y asociatividades es solo una forma. Sin embargo, no es la forma más general: este modelo no puede dar a un operador más precedencia cuando compite con '-' de lo que puede cuando compite con '+', mientras sigue dando a '+' y '-' precedencias y asociatividades equivalentes. En [1] se puede encontrar una versión generalizada de este modelo (en el que a cada operador se le pueden dar precedencias independientes de izquierda y derecha) .
Ver también
Referencias
- ↑ a b c Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1945]. "2.4.1.1.". En Grosche, Günter; Ziegler, Viktor; Ziegler, Dorothea (eds.). Taschenbuch der Mathematik (en alemán). 1 . Traducido por Ziegler, Viktor. Weiß, Jürgen (23 ed.). Thun y Frankfurt am Main: Verlag Harri Deutsch (y BG Teubner Verlagsgesellschaft , Leipzig). págs. 115-120. ISBN 3-87144-492-8.