Ausdruck gegen Aussage
Frage ich mit Bezug auf c#, aber ich nehme an, es ist die gleiche in den meisten anderen Sprachen.
Hat jemand eine gute definition von Ausdrücke und Aussagen und was die Unterschiede sind?
InformationsquelleAutor der Frage | 2008-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausdruck: Etwas, was zu einem Wert ausgewertet. Beispiel: 1+2/x
Aussage: Eine code-Zeile, die etwas tut. Beispiel: GOTO 100
In der frühesten Allgemeinen Programmiersprachen, wie FORTRAN, die Unterscheidung war Kristall-klar. In FORTRAN, eine Aussage war eine Einheit der Ausführung, eine Sache, die Sie getan haben. Der einzige Grund, es nicht als eine "Linie" war, weil es manchmal umfasst mehrere Zeilen. Ein Ausdruck auf seine eigene, konnte nichts tun... Sie musste es einer Variablen zuweisen.
ist ein Fehler im FORTRAN, weil Sie es nicht tun. Sie hatte etwas zu tun mit diesem Ausdruck:
FORTRAN nicht über eine Grammatik, wie wir Sie heute kennen—diese Idee erfunden wurde, zusammen mit der Backus-Naur-Form (BNF), als Teil der definition von Algol-60. An diesem Punkt der semantische Unterscheidung ("einen Wert haben" und "etwas tun") verankert wurde, in syntax: eine phrase ist ein Ausdruck, und eine andere war eine Aussage, und der parser könnte sagen, Sie auseinander.
Designer der später Sprachen verwischt die Unterscheidung: Sie erlaubt syntaktische Ausdrücke, Dinge zu tun, und Sie erlaubten syntaktischen Aussagen, die hatten Werte.
Das früheste populäre Sprache Beispiel, die noch überlebt, ist C. Die Designer von C erkannte, dass kein Schaden wurde getan, wenn Sie zugelassen wurden, um einen Ausdruck auszuwerten und wegwerfen, das Ergebnis. In C, jedem syntaktischen Ausdruck eine gemacht in eine Anweisung nur von Heften ein Semikolon entlang der Ende:
ist eine völlig legitime Aussage, obwohl absolut nichts passiert. Ähnlich in C, die ein Ausdruck haben kann Nebenwirkungen—es kann sich etwas ändern.
weil
callfunc
könnte nur etwas nützliches tun.Einmal ermöglichen Sie jedem Ausdruck eine Anweisung, die Sie vielleicht, wie der Zuweisungsoperator (=) in Ausdrücken. Das ist, warum C lässt Sie Dinge tun, wie
Dies wertet den Ausdruck x = 2 (Zuweisung des Wertes von 2 bis x) und dann geht das (die 2), um die Funktion
callfunc
.Diese Unschärfe der Ausdrücke und Anweisungen tritt in alle C-Derivate (C, C++, C# und Java), die haben noch einige Aussagen (wie
while
), aber die können fast jeden beliebigen Ausdruck als Anweisung (in C# nur die Zuordnung, call -, increment-und decrement-Ausdrücke verwendet werden können, Aussagen; siehe Scott Wisniewski Antwort).Zwei "syntaktische Kategorien" (das ist die technische Bezeichnung für die Art von Dingen, Aussagen und Ausdrücke werden) führt zu Doppelarbeit. Zum Beispiel, C hat zwei Formen von bedingten, die form der Anweisung
wird, und der Ausdruck form
Und manchmal sind die Leute wollen Vervielfältigung, gibt es nicht: in der standard-C zum Beispiel nur eine Anweisung deklarieren Sie eine neue lokale variable—aber diese Fähigkeit ist nützlich genug, dass die
GNU C-compiler bietet eine GNU-Erweiterung, die es ermöglicht, einen Ausdruck zu deklarieren Sie eine lokale variable als gut.
Designer von anderen Sprachen, die nicht wie diese Art der Vervielfältigung, und man sah früh, dass, wenn Ausdrücke, die Nebenwirkungen haben können, sowie Werte, dann die syntaktische Unterscheidung zwischen Anweisungen und Ausdrücken ist nicht besonders nützlich—und so kam es loswerden. Haskell, Symbol, Lisp und ML sind alle Sprachen, die keine syntaktischen Aussagen—Sie haben nur Ausdrücke. Auch die Klasse strukturiert, die Schleifen und bedingte Formen sind als Ausdrücke, und Sie haben Werte—aber nicht sehr interessant sind.
InformationsquelleAutor der Antwort Joel Spolsky
Möchte ich eine kleine Korrektur zu Joel ' s Antwort oben.
C# nicht alle Ausdrücke verwendet werden, die als Aussagen. Insbesondere, nur Zuweisung, call -, increment-und decrement-Ausdrücke verwendet werden können, Aussagen.
Z.B. der C# - compiler-flag der folgende code einen syntax-Fehler:
1 + 2;
InformationsquelleAutor der Antwort Scott Wisniewski
Beachten Sie, dass in C, "=" ist eigentlich ein operator, der zwei Dinge tut:
Hier ist ein Auszug aus dem ANSI-C-Grammatik. Sie können sehen, dass C nicht haben viele verschiedene Arten von Aussagen... die meisten von Anweisungen in einem Programm sind Ausdruck Aussagen, D. H. ein Ausdruck mit einem Semikolon am Ende.
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
InformationsquelleAutor der Antwort Mark Harrison
Ausdruck ist etwas, das einen Wert zurückgibt, in der Erwägung, dass eine Aussage nicht.
Beispiele:
Großen Deal zwischen den beiden ist, dass Sie können Kette von Ausdrücken zusammen, in der Erwägung, dass Anweisungen können nicht verkettet werden.
InformationsquelleAutor der Antwort Patrick
Diese finden Sie auf wikipediaaber Ausdrücke werden ausgewertet, um einen gewissen Wert, während Aussagen haben keinen Wert bewertet.
Somit können Ausdrücke in Aussagen, aber nicht die andere Weise herum.
Beachten Sie, dass einige Sprachen (z.B. Lisp, und ich glaube, Ruby und viele andere) nicht unterscheiden Anweisung vs. Ausdruck... in solchen Sprachen, alles ist ein Ausdruck und kann verkettet werden mit anderen Ausdrücken.
InformationsquelleAutor der Antwort Mike Stone
Für eine Erläuterung der wichtigsten Unterschiede in der Kombinierbarkeit (verkettbarkeit) der Ausdrücke vs. Anweisungen, meine Lieblings-Referenz ist John Backus ist Turing-award Papier, Kann Programmierung sein, befreit von der von-Neumann style?.
Imperative Sprachen (Fortran, C, Java, ...) betonen-Anweisungen zur Strukturierung von Programmen und Ausdrücken, wie eine Art nach-gedacht. Funktionale Sprachen betonen Ausdrücke. Rein funktionale Sprachen haben so starke Ausdrücke als Anweisungen können ganz beseitigt werden.
InformationsquelleAutor der Antwort Conal
Einfach: ein Ausdruck zu einem Wert ausgewertet wird, eine Erklärung nicht.
InformationsquelleAutor der Antwort Matthew Schinckel
Ausdrücke können ausgewertet werden, um einen Wert, in der Erwägung, dass Aussagen, die keinen Wert zurückgeben (Sie sind der Typ void).
Funktion call-Ausdrücke können auch als Aussagen natürlich, aber es sei denn, die Umgebung, die zur Ausführung hat eine spezielle built-in-variable, um den Rückgabewert, es gibt keinen Weg, um es abzurufen.
Statement-orientierten Sprachen erfordern alle Verfahren eine Liste von Aussagen. Ausdrucks-orientierte Sprache, was wahrscheinlich alle funktionalen Sprachen sind Listen von Ausdrücken, oder in tha Falle von LISP, einer langen S-Ausdruck, der darstellt, eine Liste von Ausdrücken.
Obwohl beide Arten kombiniert werden können, die meisten Ausdrücke können aus beliebig, solange die Datentypen übereinstimmen. Jede Art von Anweisung hat seine eigene Art zu Komponieren anderen Aussagen, wenn Sie das tun können, alle. Foreach-und if-Anweisungen erfordern entweder eine einzelne Anweisung oder, dass alle untergeordneten Anweisungen in einem Anweisungsblock, eine nach der anderen, es sei denn, die substatements erlauben, für Ihre eigenen substatements.
Aussagen können auch Ausdrücken, wobei ein Ausdruck, der nicht wirklich zählen, keine Aussagen. Eine Ausnahme, obwohl, wäre ein lambda-Ausdruck ist eine Funktion, und so kann alles beinhalten, kann eine Funktion beinhalten, es sei denn, die Sprache erlaubt nur für eine begrenzte lambdas, wie Python ' s single-expression lambdas.
In einem Ausdruck-basierte Sprache, alles, was Sie brauchen, ist ein einziger Ausdruck für eine Funktion, da alle Kontrollstrukturen einen Wert zurückgeben (viele von Ihnen kehren NIL). Es gibt keine Notwendigkeit für eine return-Anweisung, da die Letzte ausgewertete Ausdruck in der Funktion ist der Rückgabewert.
InformationsquelleAutor der Antwort Mark Cidade
Einige Dinge über expression-basierte Sprachen:
Wichtigste: Alles gibt Sie einen Wert
Gibt es keinen Unterschied zwischen geschweiften Klammern und die geschweiften Klammern zur Abgrenzung von code-Blöcke und Ausdrücke, denn alles ist ein Ausdruck. Dies verhindert nicht, dass lexikalische scoping-obwohl: Eine lokale variable kann definiert werden, für den Ausdruck, in dem seine definition enthalten ist, und alle Aussagen innerhalb, dass, zum Beispiel.
In einem Ausdruck basierende Sprache, alles, was einen Wert zurückgibt. Dies kann ein wenig seltsam auf den ersten -- Was macht
(FOR i = 1 TO 10 DO (print i))
zurück?Einige einfache Beispiele:
(1)
zurück1
(1 + 1)
zurück2
(1 == 1)
zurückTRUE
(1 == 2)
zurückFALSE
(IF 1 == 1 THEN 10 ELSE 5)
zurück10
(IF 1 == 2 THEN 10 ELSE 5)
zurück5
Ein paar komplexere Beispiele:
OpenADoor(), FlushTheToilet()
oderTwiddleYourThumbs()
zurückgeben wird eine Art von Weltlichen Wert, wie OK, Fertig, oder Erfolg.(FOR i = 1 TO 10 DO (print i))
den Wert der for-Schleife ist "10", es bewirkt, dass die(print i)
Ausdruck ausgewertet werden, 10 mal, jedes mal zurückkehren, die ich als string. Die Letzte Zeit durch zurück10
unsere endgültige AntwortEs erfordert oft eine leichte änderung der Einstellung um das beste aus einem Ausdruck basierende Sprache, denn die Tatsache, dass alles ist ein Ausdruck, der es möglich macht, 'inline' eine Menge Dinge
Als schnelles Beispiel:
ist ein perfekt gültigen Ersatz für die nicht-expression-basierte
In einigen Fällen, das layout, Ausdruck-basierten code erlaubt, fühlt sich viel natürlicher an mir
Natürlich, das kann bis zum Wahnsinn führen. Als Teil eines hobby-Projektes in einem Ausdruck-basierte Skriptsprache MaxScript, ich konnte mit diesem monster Linie
InformationsquelleAutor der Antwort
Aussage ist ein Spezialfall eines Ausdrucks, eines mit
void
geben. Die Tendenz der Sprachen, die zur Behandlung von Aussagen anders verursacht Häufig Probleme, und es wäre besser, wenn Sie richtig waren, verallgemeinert.Beispielsweise in C# haben wir die sehr nützlich
Func<T1, T2, T3, TResult>
überlastet Satz von generischen Delegaten. Aber wir haben auch eine entsprechendeAction<T1, T2, T3>
gesetzt, und der Allgemeine Zweck, höher -, um-Programmierung ständig dupliziert werden, um sich mit diesem unglücklichen Zweiteilung.Triviales Beispiel - eine Funktion, die überprüft, ob eine Referenz null ist, bevor Sie auf eine andere Funktion:
Könnte der compiler befassen sich mit der Möglichkeit der
TResult
wirdvoid
? Ja. Alle Sie tun muss ist, verlangen, dass die Rückgabe gefolgt von einem Ausdruck, der den Typvoid
. Das Ergebnisdefault(void)
wäre der Typvoid
und die func weitergegeben werden müssten, um die formFunc<TValue, void>
(das wäre äquivalent zuAction<TValue>
).Einer Reihe von anderen Antworten implizieren, dass Sie können nicht chain-Anweisungen, wie Sie mit Ausdrücken, aber ich bin mir nicht sicher, wo diese Idee herkommt. Denke, wir können die
;
angezeigt, wenn Aussagen als binärer infix-operator, nehmen zwei Ausdrücke vom Typvoid
und kombiniert Sie in einen einzelnen Ausdruck vom Typvoid
.InformationsquelleAutor der Antwort Daniel Earwicker
Aussagen -> Anleitungen zu Folgen nacheinander
Ausdrücke -> Bewertung, die einen Wert zurückgibt
Aussagen sind im Grunde wie Schritte oder Anweisungen in einem Algorithmus, der das Ergebnis der Ausführung einer Anweisung ist die Aktualisierung der instruction-pointer (so genannte assembler)
Ausdrücke implizieren nicht und die Reihenfolge der Ausführung auf den ersten Blick, Ihr Zweck ist es, zu bewerten, und einen Wert zurückgeben. In der imperativen Programmiersprache die Auswertung eines Ausdrucks hat einen Auftrag, aber es ist nur, weil der Imperativ-Modell, aber es ist nicht Ihr Wesen.
Beispiele von Aussagen:
(alle von Ihnen implizieren, das Fortschreiten der Zeile (Anweisung) der Ausführung zu einer anderen Linie)
Beispiel Ausdrücke:
(es bedeutet nicht, die Idee der Ausführung, aber von der Bewertung)
InformationsquelleAutor der Antwort Andaquin
Aussagen sind grammatisch vollständige Sätze. Ausdrücke nicht. Zum Beispiel
liest sich als "x wird 5." Dies ist ein kompletter Satz. Der code
liest, "x-plus 5 geteilt durch 9.0." Dies ist kein vollständiger Satz. Die Aussage
ist ein kompletter Satz. Beachten Sie, dass die loop-header nicht; "während der k < 10", ist eine Unterordnung Klausel.
InformationsquelleAutor der Antwort ncmathsadist
Bevorzuge ich die Bedeutung von
statement
in die formale Logik Sinn des Wortes. Es ist eine, ändert sich der Status von einer oder mehr Variablen in der Berechnung, sodass eine wahre oder falsche Aussage über deren Wert(en).Ich denke, es wird immer wieder Verwirrung in der it-Welt und der Wissenschaft im Allgemeinen, wenn neue Begriffe oder Wörter werden eingeführt, bestehende Wörter sind 'aufbereiten' oder Benutzer in Unkenntnis der bestehenden, etablierten oder 'korrekte' Terminologie für das, was Sie beschreiben
InformationsquelleAutor der Antwort vfclists
Ich bin nicht wirklich zufrieden mit die Antworten hier. Ich schaute auf die Grammatik für C++ (ISO 2008). Aber vielleicht aus Gründen der Didaktik und der Programmierung die Antworten ausreichen könnte, um zwischen den beiden Elementen (die Realität sieht komplizierter, obwohl).
Einer Anweisung besteht aus null oder mehr Ausdrücken, sondern kann auch andere Sprache Konzepte. Dies ist die Erweiterte Backus-Naur-form für die Grammatik (Auszug for-Anweisung):
Können wir sehen, die andere Konzepte, sind als Aussagen in C++.
case
zum Beispiel ist ein beschriftet-Anweisungif
if/else
case
while
do...while
for (...)
break
continue
return
(zurückgeben kann Ausdruck)goto
try/catch
BlöckeDies ist ein Auszug zeigt die Ausdrücke Teil:
+
-
*
/
&
|
&&
||
...)throw
- Klausel ist ein Ausdruck, der zuInformationsquelleAutor der Antwort Ely
Anweisung,
Aussage ist eine verfahrenstechnische Bausteine, aus denen alle C# - Programme aufgebaut sind. Eine Anweisung deklarieren Sie eine lokale variable oder eine Konstante, eine Methode aufzurufen, erstellen Sie ein Objekt oder einen Wert zuweisen, um eine variable, eine Eigenschaft oder ein Feld.
Einer Reihe von Aussagen, umgeben von geschweiften Klammern bilden einen block von code. Eine Methode, die Körper, ist ein Beispiel für einen code-block.
Anweisungen in C# enthalten oft Ausdrücke. Ein Ausdruck in C# ist ein Codefragment mit einem Literalwert, ein einfacher name, oder ein operator und seinem Operanden.
Ausdruck,
Ausdruck ist ein fragment von code, der ausgewertet werden kann, um einen einzelnen Wert, ein Objekt, eine Methode oder ein namespace. Die einfachsten Ausdrücke sind Literale und einfache Namen. Ein literal ist ein konstanter Wert, der keinen Namen hat.
Sowohl ich als auch s sind einfach Namen, die Identifizierung von lokalen Variablen. Wenn diese Variablen werden in einem Ausdruck verwendet, der den Wert der Variablen abgerufen und verwendet für den Ausdruck.
InformationsquelleAutor der Antwort Sujit
Hier ist die sommerliche eines der einfachsten Antwort, die ich fand.
ursprünglich Beantwortet von Anders Kaseorg
Aussage ist eine komplette Linie der code eine Aktion ausführt, während ein Ausdruck ist ein beliebiger Abschnitt der code, der zu einem Wert ausgewertet.
Ausdrücke können kombiniert werden "horizontal" in größere Ausdrücke mit Operatoren, while-Anweisungen können nur kombiniert werden, "vertikal" durch das schreiben einer nach dem anderen, oder mit block-Konstrukte.
Jeder Ausdruck kann verwendet werden, als eine Anweisung (deren Wirkung, um den Ausdruck auszuwerten, und ignorieren Sie den resultierenden Wert), aber die meisten Anweisungen können nicht verwendet werden, die als Ausdrücke.
http://www.quora.com/Python-programming-language-1/Whats-the-difference-between-a-statement-and-an-expression-in-Python
InformationsquelleAutor der Antwort MadNik
Verbessern und bestätigen meine Vorherige Antwort, die Definitionen der Programmiersprache Begriffe sollten erklärt werden, aus der informatik Art Theorie, wenn anwendbar.
Ausdruck hat einen anderen Typ als die Art des Bodens, D. H. es hat einen Wert. Eine Erklärung hat die Einheit oder Unten geben.
Daraus folgt, dass eine Aussage kann nur einen Effekt haben, in einem Programm, wenn es erstellt eine Nebenwirkung, weil es entweder nicht, einen Wert zurückzugeben oder es gibt nur den Wert der Einheit geben, die entweder nicht zuweisbare Daten (in einigen Sprachen, wie Z a C s
void
) oder (wie in Scala) können gespeichert werden für eine verspätete Bewertung der Aussage.Offensichtlich ein
@pragma
oder eine/*comment*/
haben keine Art und Weise unterschieden von Aussagen. So ist die einzige Art von Anweisung, würde haben keine Nebenwirkungen, wäre eine nicht-operation. Nicht-Betrieb ist nur sinnvoll als Platzhalter für zukünftige Nebenwirkungen. Jede andere Handlung aufgrund einer Aussage wäre ein Nebeneffekt. Wieder eine compiler-Hinweis, z.B.@pragma
ist nicht eine Aussage, weil es keine geben.InformationsquelleAutor der Antwort Shelby Moore III
Sehr genau, so eine Aussage muss ein "Nebeneffekt" (d.h. sein Imperativ) und einem Ausdruck muss haben eine Wert geben (also nicht die Art des Bodens).
Den geben Sie eine Erklärung ist das Gerät geben, aber aufgrund Einhalt zu Gebieten theorem Einheit ist eine Fiktion, so sagen wir, dass die unten geben.
Void
ist nicht gerade die Art des Bodens (es ist nicht der Subtyp aller möglichen Arten). Es existiert in Sprachen, die nicht über einen komplett-sound-system geben. Das klingt vielleicht snobistisch Aussage, aber der Vollständigkeit wie Varianz-Annotationen sind kritisch zu schreiben erweiterbare software.Lassen Sie uns sehen, was Wikipedia zu sagen hat, in dieser Angelegenheit.
https://en.wikipedia.org/wiki/Statement_(computer_science)
InformationsquelleAutor der Antwort Shelby Moore III