2009-06-17 5 views
12

Dieses einfache csh-Skript, wenn ausgeführt, produziert "0" für die Ausgabe, wenn ich "2" erwarten würde.In csh, warum ist 4 - 3 + 1 == 0?

~root: csh simple.1 
0 

habe ich ein paar suchen und das einzige, was ich denken konnte, war, dass die „-“ wurde eher als eine einstellige Negation gelesen werden als Subtraktion, also Operator Vorrang zu ändern und mit 4 enden - eher 4 als 2 + 1. Ist das korrekt? Wenn ja, warum? Wenn nicht ... Hilfe!

Edit: Sie sind also richtig assoziativ! Diese Operatoren sind in C NICHT richtig assoziativ, oder? Ist C-Shell anders als C?

+4

ausgewertet ist eine bessere Frage ... warum csh Verwendung rechtsassoziativ Parse-Bäume und nicht links? –

+11

... und eine bessere Frage. warum benutze csh? –

+0

Ich habe es nicht wirklich benutzt. Es war eine Frage, die ich einem Freund beantworten wollte. Hier ist die neue Diskussion: http://StackOverflow.com/Questions/1010119/ – Instantsoup

Antwort

32

Während Sie die Operatoren erwarten assoziativen gelassen werden, sie sind right associative in csh, so dass es hier als 4-(3+1)

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

Das ist kein Parsebaum. Es ist kein AST. Sehen Sie sich die BNF erneut an und sehen Sie, wie beide Operanden und Operatoren Kindknoten eines Ausdrucksknotens sind. Compiler müssen zusätzliche Arbeit leisten, um Parse-Bäume in Ausdrucksbäume umzuwandeln. –

3

Operatorgruppierung. Es liest die Operation als 4 - (3 + 1), im Gegensatz zu (4 - 3) + 1.

21

Die Operatoren + und - sind in csh rechtsassoziativ. Dies bedeutet, dass "4 - 3 + 1" als "4 - (3 + 1)" bewertet wird.