syntaxfragen



  • hallo.

    im laufe der zeit sind mir einige fragen eingefallen, auf die ich (sonst wuerd' ich sie ja nicht posten) keine antwort weiss:

    if ( (a) || (b) ) {
    ...
    }
    

    wird (b) ausgefuehrt, wenn a richtig ist oder wird die bedingung b uebersprungen? in diesem zusammenhang habe ich schon mal den begriff short circuit gehoert.

    2. werden char's oder nur static char's mit '\0' initialisiert ? und heisst '\0' NIL ?

    3. wenn ich ein char[5] deklariere, bedeutet das, dass das abschliessende '\0' innerhalb der 5 char elemente stehen muss?

    wuerde mich freuen wenn mir jemand auf diese fragen antwroten wuerde. danke im vorraus.

    Gruss
    caspar



  • 1. Das ist der OR-Operator. Es wird überprüft, ob a ODER b ungleich 0 ist. Wenn eins davon zutrifft, ist die Bedingung WAHR. Was du vielleicht meinst ist, dass, wenn a schon ungleich 0 ist, b nicht mehr überprüft wird?! short circuit sagt mir in dem Zusammenhang jedenfalls nichts...

    2. '\0' ist das Terminierungszeichen. Das bedeutet, sobald das Zeichen auftritt, dass der String zuende ist:

    char *text="Dies ist ein \0 Test";
    

    Das Wort "Test" würde nicht mehr erscheinen. Hinter Test steht aber auch nochmal implizit ein '\0', so dass der String da auf jeden Fall beendet ist.

    Das hat aber nix mit static zu tun?!

    3. Ja. Das ist Falsch:

    char text[5]="Hallo";
    


  • Ergänzend zu 1)

    da b ja auch eine Anweisung mit Seitenefekten sein kann ist diese Frage schon relevant, und es ist tatsächlich so das b nicht mehr ausgefürt wird wenn a schon wahr ist.



  • vom programmierer nicht initialisierte static-variablen werden mit 0 initialisiert, wie die globalen variablen auch, soweit ich mich an c erinnere.



  • Caspar schrieb:

    in diesem zusammenhang habe ich schon mal den begriff short circuit gehoert.

    Das heißt "short cut evaluation". Analog wir bei der Abfrage a UND b das b nicht ausgewertet, wenn a bereits unwahr ( = 0) ist.



  • danke erst mal fuer die antworten.

    Es wird überprüft, ob a ODER b ungleich 0 ist. Wenn eins davon zutrifft, ist die Bedingung WAHR. Was du vielleicht meinst ist, dass, wenn a schon ungleich 0 ist, b nicht mehr überprüft wird?! short circuit sagt mir in dem Zusammenhang jedenfalls nichts...

    was eine || anweisung macht und wie ich sie einsetze weiss ich. wollte eben nur wissen, ob die zweite bedingung, die in meinem fall tatsaechlich einen nebeneffekt hat -- darum ging es mir ja, auch ausgefuehrt wird... die antwort habe ich ja erhalten.
    short circuit, gibt's dann wahrscheinlich doch nicht, keine ahnung woher ich das habe.

    wenn es heisst ein static string wird mit 0 initialisiert, wird er dann mit \0 oder 0 initialisiert?
    gibt es den term NIL ueberheupt. auf http://www.and.org/vstr/comparison.html wird von NIL characters gesprochen.



  • Caspar schrieb:

    short circuit, gibt's dann wahrscheinlich doch nicht, keine ahnung woher ich das habe.

    Doch, IIRC nennt sich dieses verhalten so.

    wenn es heisst ein static string wird mit 0 initialisiert, wird er dann mit \0 oder 0 initialisiert?
    gibt es den term NIL ueberheupt. auf http://www.and.org/vstr/comparison.html wird von NIL characters gesprochen.

    0 == '\0'

    NIL existiert nicht, es gibt nur NULL - das ist ((void*)0) - also ein 0-Zeiger.



  • NIL existiert doch. Zum Glück aber nicht in der C-Welt. NIL kommt aus Delphi. Borland guckt sich so einiges von C ab. Sei es Bit-Shift Operatoren, oder den Null Zeiger. NIL steht für Not In List und ist soweit ich mich noch erinnern kann das pendant zu NULL in C.



  • NIL kommt von Lisp (Ende der 50er *g*) oder ist noch älter ... Not In List ist IMHO falsch, da der Name nicht besonders sinnfällig wär und es "nil" auch als englisches Wort in der Bedeutung "nichts" gibt.

    Das ASCII-Zeichen mit dem Wert 0 heißt übrigens NUL.

    Nochwas: in C ist auch char foo[5]="Hallo"; erlaubt. Der String wird dann nicht nullterminiert.



  • in C ist auch char foo[5]="Hallo"; erlaubt. Der String wird dann nicht nullterminiert.

    Naja, aber deswegen isses ja nicht richtig. Ich kann mir nicht vorstellen, dass irgendjemand sowas beabsichtigt.....



  • Wie "nicht richtig"? Wenn es falsch wär, wär es nicht erlaubt.



  • Das ist doch jetzt Haarspalterei. Den offensichtlichen Zweck, den 'char foo[5]="Hallo" '; erfüllen soll, erfüllt es eben nicht vollständig.



  • Offensichtlich erfüllt es den Zweck, ein 5-elementiges Array anzulegen, das mit einer nicht nullterminierten Zeichenkette des Inhalts "Hallo" gefüllt werden soll, sehr gut.



  • Bashar schrieb:

    Offensichtlich erfüllt es den Zweck, ein 5-elementiges Array anzulegen, das mit einer nicht nullterminierten Zeichenkette des Inhalts "Hallo" gefüllt werden soll, sehr gut.

    Aber sind Zeichenketten nicht immer nullterminiert? So steht's in meinem Lehrbuch...



  • Eine Zeichenkette mag ja immer nullterminiert sein. Aber wer sagt denn das man ein Characterarray immer als Zeichenkette behandeln muss. Das ist erstmal eine Datenstruktur wie jedes andere Array auch. Wie du die Daten die es beinhaltet jetzt bearbeitest oder interpretierst kommt ja auf den Programmierer an. Im Zweifelsfall sind es einfach n chars.

    Gruß
    Entyl Sa



  • Ich finds immer wieder erstaunlich, wie über die grundlegendsten Dinge diskutiert wird. Ja, natürlich muss das nicht so sein. Aber wenn jemand schreibt:

    char text[5]="Hallo";
    

    ..dann kann man doch zu 99.99% davon ausgehen, dass er/sie eigentlich einen nullterminierten String haben wollte, unabhängig davon, ob er/sie weiss was das ist oder nicht. Und auch ob das jetzt vom Compiler bemängelt wird oder nicht, und auch unabhängig davon was im Standard dazu steht, sind solche Dinge sehr sehr oft Ursachen für schwerwiegendere Fehler, weswegen sowas vermiden werden sollte.



  • Das kann man sehen wie man will.

    Sobald jemand in die [] einen Wert reinschreibt, gehe ich davon aus, dass er weiss, was er tut.

    Natürlich ist es ein beliebter Anfänger Fehler - aber generell lese und schreibe ich wenig Anfänger Code 😉

    Ich finde es übrigens schön, dass wir uns über solche Kleinigkeiten unterhalten - davon lernt man enorm viel.


Anmelden zum Antworten