Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Semantische Fehler sind Fehler in der Programmlogik. Also so was z.b.:


int i;
do
{
printf("Bitte eine Zahl zwischen 1 und 4 eingeben: ");
scanf("%i",&i);
}
while(i < 5);
[/PHP]

Das Programm verlangt nach einer Zahl zwischen 1 und 4, die Schleife läuft aber so lange wie die Zahl kleiner als 5 ist. Wie du dir sicher denken kannst können solche Fehler nicht vom Compiler festgestellt werden.

Das Gegenteil dazu sind syntaktische (bzw. Syntax) Fehler, welche bedeuten das z.b eine Variable nicht existiert oder so. Diese können vom Compiler festgestellt werden.

Gruß

Guybrush

Geschrieben

@Guybrush Threepwood:

Dein Beispiel ist AFAIK ein logischer Fehler. Ein semantischer Fehler wäre etwas, was zwar syntaktisch korrekt ist, aber im Zusammenhang, wenn man die Bedeutung der Bezeichner und Operatoren berücksichtigt, falsch ist.

Zwei Beispiele in C++:

a = b + c;

Das ist syntaktisch korrekt, aber wenn b und c Zeiger sind, semantisch falsch, weil man zwei Zeiger nicht addieren kann.

a = b();

Das ist auch syntaktisch richtig. Wenn b aber weder eine Funktion noch eine Instanz einer Klasse mit operator() ist (sondern z.B. nur ein einfacher int), geht das trotzdem nicht.

Der Compiler kann solche Fehler durchaus finden.

Geschrieben
Original geschrieben von DingDong

if (a=B) {}

statt:

if (a==B) {}

Wobei sich da aber die Frage stellt, ob das ein semantischer Fehler ist. Syntaktisch geht ja beides. Die erste Variante kann theoretisch sinnvoll sein. Vielleicht ist es doch eher zu den logischen Fehlern zu rechnen.

Semantische Fehler sind m. W. Daten, die sinnlos sind, weil sie eine falsche bzw. nichtige Bedeutung haben wie z. B. "35. Januar".

Geschrieben
Original geschrieben von Klotzkopp

@Guybrush Threepwood:

Dein Beispiel ist AFAIK ein logischer Fehler. Ein semantischer Fehler wäre etwas, was zwar syntaktisch korrekt ist, aber im Zusammenhang, wenn man die Bedeutung der Bezeichner und Operatoren berücksichtigt, falsch ist.

Kann man aus dem Beispiel heraus ueberhaupt entscheiden? Wenn der Fehler in der Bedingung hinter dem while liegt, ist es sicher ein logischer Fehler. Kann aber auch sein, dass der Meldetext eine fehlerhafte Bedeutung hat; dann wuerde ich das als semantischen Fehler ansehen.

Geschrieben

Hallo,

Original geschrieben von gajUli

Die erste Variante kann theoretisch sinnvoll sein.

Nicht nur theoretisch sondern auch praktisch. if (a=B) {} ist gleichzusetzen mit if (a=malloc(...)) {}. Derartige Konstrukte sind integraler Bestandteil eine jeden C-Programms.

Nic

Geschrieben

Original geschrieben von nic_power

>Nicht nur theoretisch sondern auch praktisch. if (a=B) {} ist gleichzusetzen mit if (a=malloc(...)) {}.

Ich seh das so: a wird mit dem Wert von b ueberschrieben und die if-clause mit diesem Wert ausgewertet.

Darum erzeugt das hier

#include <stdio.h>

int main(void)
{
int a=1,b=2;

if (a= printf("%d %d",a,;

return 0;
}[/PHP]

den simplen Output "2 2".

Ich wuesste allerdings nicht, wieso dafuer eine Memory Allocation ablaufen sollte; laeuft doch alles mit Stack und Registern.

Geschrieben

Hallo,

malloc() war auch nur ein Beispiel. Ich wollte eigentlich darauf hinaus, dass es in C/C++ üblich ist, Zuweisungen innerhalb eines Vergleichs vorzunehmen. D.h. Konstrukte der Art if (a=B) sind eher die Regel, sofern b eine Funktion ist die ein Ergebnis zurückliefert. Was man ebenfalls häufiger sieht:


   char *a, *b;


   b=function();


   if (a= {

      ...

   } else {

      ...

   }

[/code]

Ist zwar nicht elegant und verleitet zu Fehlern (da nicht wirklich klar ist, ob "if (a=b)" auch so gemeint ist, wies im Code steht), wird aber gerne verwendet.

Nic

Geschrieben

Hallo,

bei

if (a=B) {};

ist das Ergebnis doch eigentlich nur dann true, wenn b>0.

>0 =^= TRUE

=0 =^= FALSE

Nochmal auf Semantikproblem zurück zukommen,

definieren eigentlich nicht die Datentypen den Syntax?

---

Sind vielleicht nicht doch alle Fehler, logische Fehler? ;-)

Geschrieben
Original geschrieben von Tapeman

Nochmal auf Semantikproblem zurück zukommen,

definieren eigentlich nicht die Datentypen den Syntax?

Nein, zum Zeitpunkt der Syntaxanalyse gibt es noch keine "Datentypen". Die Syntax für eine if-Anweisung könnte z.B. so aussehen:

if(Ausdruck) Anweisung

Sowohl für Ausdruck als auch für Anweisung gibt es wieder eigene Syntaxregeln. Ein Ausdruck könnte z.B. sein:

Ausdruck BinärerOperator Ausdruck

oder nur

Bezeichner

Damit ist a = b ein syntaktisch gültiger Ausdruck.

Wenn jetzt b nicht an a zugewiesen werden kann (z.B. weil kein passender Zuweisungsoperator vorhanden ist), dann ist das semantisch falsch.

Wenn == gemeint war, ist es logisch falsch.

Sind vielleicht nicht doch alle Fehler, logische Fehler? ;-)
Nein. Das hier sind ziemlich sicher Syntaxfehler:

if(a=)

if a=B)

if(a=if)

;)

Geschrieben

Nagut,

das meine ich gar nicht mal, klar if(a=B){} ist syntaktisch korrekt, obwohl es eigentlich auch nicht schlecht wäre, wenn es einer wäre, dann könnte man nämlich die Tippfehler erkennen.

Aber bei

Ausdr BinOp Ausdr ist das Ergebnis des binären Operators ist doch auch ein Ausdruck.

Kann man vielleicht folgendes sagen:

Syntax=Grammatik/Form.

Semantik=Inhalt.

Syntaxfehler:

Der Compiler ist nicht in der Lage den Code in Assembler zu übersetzen.

Semantikfehler:

Der Compiler ist zwar i.d. Lage d. Code in Assembler zu übersetzen, übersetzt aber das vermeidlich richtige.

-----

Man könnte ja doch theoretisch sagen, die Syntax ist die erste Dimension, die Semantik die zweite Dimension.

Gruß Tapeman

Geschrieben
Original geschrieben von Tapeman

Syntaxfehler:

Der Compiler ist nicht in der Lage den Code in Assembler zu übersetzen.

So kann man das nicht sagen. Die Syntaxprüfung beinhaltet nur, ob der Quelltext der Struktur der jeweiligen Programmiersprache entspricht. Da ist noch nichts übersetzt.

Die Trennung zwischen semantischem Fehler und logischem Fehler ist nicht immer eindeutig möglich, es hängt auch oft von der Absicht des Programmierers ab, und die kann der Compiler nicht kennen.

Was dummes nebenbei, kann mir jemand folgendes erklären?

void main(void)

{

5; // Ausdruck; ???? kein syntakt. Fehler

};

Das ist völlig korrekt so. Eine Anweisung kann aus einem Ausdruck, abgeschlossen mit einem Semikolon, bestehen, und ein numerisches Literal ist auch ein Ausdruck. Dass der "Wert" dieses Ausdrucks nicht weiterverarbeitet wird, macht ja nichts.

Nachtrag:

Ein Compiler dürfte sich aber laut Standard über "void main" beklagen. ;)

Das wäre dann IMHO ein semantischer Fehler.

Geschrieben
Original geschrieben von Klotzkopp

Ein Compiler dürfte sich aber laut Standard über "void main" beklagen. ;)

Aber es kann doch sein, dass kein Rückgabewert kommt?

Unser Leher hat uns das schon so gezeigt

Geschrieben

Ok, ich versuche auch mal ein wenig Licht ins Dunkle zu bringen.

Die Frage nach

void main (void)

ist meiner Meinung nach nicht so einfach zu beantworten. Denn es gibt ja genügend Compiler, die das so unterstützen. Allerdings muß man bedenken, daß man dann nicht mehr Ansi-C oder Iso-C++ programmiert, sondern nur in einer Sprache, die den beiden genannten Sprachen sehr, sehr ähnlich ist. Ich würde also

void main (void)

im Standard C/C++ Forum für falsch ansehen, aber außerhalb des Forum als "Feature" der Entwicklungsumgebung.

Ich würde dafür plädieren, void main (void) aus der "semantischer Fehler"-Diskussion herauszuhalten, weil das eher verwirrt.

Ein Beispiel für einen semantischen Fehler:

Die Sonne ist grün.

Dieser Satz ist, wenn man sich ihn auf der syntaktischen Ebene ansieht, ein korrekter Satz. Im Gegensatz zu: Die grün Sonne ist. Dieser Satz ist syntaktisch falsch.

Aber die Sonne ist nicht grün... Semantik kann man mit Inhalt gleichsetzen (also zumindestens in diesem Zusammenhang). Also ist: "Die Sonne ist grün" ein semantischer Fehler, weil der Satz inhaltlich nicht richtig ist.

(Welche Farbe die Sonne nun wirklich hat, will ich hier jetzt außen vor lassen, denn als es in Kanada einen riesigen Waldbrand gab, erschien die Sonne tatsächlich grün. Und auch die Atmosphäre verschiebt die Sonnenfarbe ins gelbliche. Im Weltraum sollte die Sonne einen Blaustich haben...)

HTH

Jan

Geschrieben

Hallo,

void main(void) ist geklärt,

daß die Sonne im All einen leichten Blaustich hat auch,

aber verstehe ich nicht was der Ausdruck "5;" nun so richtig bewirkt, zwar ist er richtig, aber was macht "5;" ? Schreibt er eine 5 in den Stack ? :-)

Gruß Tapeman

Geschrieben

Hallo,

Original geschrieben von Tapeman

aber verstehe ich nicht was der Ausdruck "5;" nun so richtig bewirkt, zwar ist er richtig, aber was macht "5;" ? Schreibt er eine 5 in den Stack ? :-)

Gar nichts. Ein guter Compiler optimiert die "5" einfache weg und erzeugt ein leeres Main-Programm. Ein schlechter Compiler legt die "5" ins Datensegment (das Programm ist dann etwas größer, tut aber immer noch nichts, da keinerlei Funktion aufgerufen wird).

Nic

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...