2009-06-17 20 views
12
#!/bin/csh 

@ cows = 4 - 3 + 1 
echo $cows 

Este sencillo script csh cuando se ejecuta produce "0" para la salida cuando esperaba "2".En csh, ¿por qué 4 - 3 + 1 == 0?

~root: csh simple.1 
0 

Hice un montón de espera y lo único que podía pensar era que el "-" estaba siendo leída como una negación unaria en lugar de restar, por lo tanto, cambiar la precedencia de operadores y terminando con el 4 - 4 en vez que 2 + 1. ¿Es esto correcto? Si es así, ¿por qué? Si no ... ¡ayuda!

Editar: ¡Así que son correctos asociativos! Estos operadores NO son asociativos correctos en C, ¿verdad? ¿C-Shell es diferente de C?

+4

He aquí una pregunta mejor ... ¿por qué árboles de análisis sintáctico uso CSH asociativo por la derecha y no la izquierda? –

+11

... y una mejor pregunta. ¿Por qué usar csh? –

+0

No estaba realmente usándolo. Era una pregunta que intentaba responder por un amigo. Aquí está la nueva discusión: http://stackoverflow.com/questions/1010119/ – Instantsoup

Respuesta

32

Mientras que usted está esperando los operadores a quedar asociativo, son right associative in csh, por lo que se evalúa como 4-(3+1)

- 
/\ 
/ \ 
4  + 
    /\ 
    3 1 
+0

No es un árbol de análisis. No es un AST. Mire de nuevo el BNF y vea cómo los operandos y los operadores son nodos secundarios de un nodo de expresión. Los compiladores tienen que hacer un trabajo extra para convertir los árboles de análisis en árboles de expresiones. –

3

Agrupación de operadores. Está leyendo la operación como 4 - (3 + 1), a diferencia de (4 - 3) + 1.

21

Los operadores + y - son asociativos de la derecha en csh. Esto significa que '4 - 3 + 1' se evalúa como '4 - (3 + 1)'.