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

@ cows = 4 - 3 + 1 
echo $cows 

Questo semplice script csh in esecuzione produce "0" per l'output quando mi aspetterei "2".In csh, perché 4 - 3 + 1 == 0?

~root: csh simple.1 
0 

ho fatto un sacco di ricerca e l'unica cosa che potevo pensare era che la "-" veniva letto come una negazione unaria invece di sottrazione, quindi cambiando precedenza degli operatori e finendo con 4-4 piuttosto di 2 + 1. È corretto? Se è così, per quale motivo? Se no ... aiuto!

Modifica: Quindi hanno ragione associativo! Questi operatori NON sono giusti associativi in ​​C, vero? C-Shell è diverso da C?

+4

Ecco una domanda migliore ... Perché alberi di analisi uso csh destra-associativo e non lasciato? –

+11

... e una domanda migliore. perchè usare csh? –

+0

In realtà non lo stavo usando. Era una domanda a cui stavo cercando di rispondere per un amico. Ecco la nuova discussione: http://stackoverflow.com/questions/1010119/ – Instantsoup

risposta

32

Mentre si è in attesa degli operatori per essere lasciati associative, sono right associative in csh, quindi è valutata come 4-(3+1)

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

Questo non è un albero di analisi. Non è un AST. Guardare nuovamente il BNF e vedere come sia gli operandi che gli operatori sono nodi figli di un nodo di espressione. I compilatori devono fare del lavoro extra per convertire gli alberi di analisi in alberi di espressione. –

3

Raggruppamento operatore. Sta leggendo l'operazione come 4 - (3 + 1), a differenza di (4 - 3) + 1.

21

Gli operatori + e - sono giusti-associativi in ​​csh. Ciò significa che "4 - 3 + 1" è valutato come "4 - (3 + 1)".