Hallo, kann mir jmd. sagen, was in folgendem Kontext (*stringWithInt!=0) bedeutet? while(!isdigit(*stringWithInt))&&(stringWithInt!=0)) stringWithInt++; tail=stringWithInt; Bedeutet es: "Wenn stringWithInt, auf den der Zeiger zeigt, leer (?) ist, dann.." Danke. Gruß Chris
so wie es da steht, heisst es "solange der Zeiger nicht NULL ist" ich vermute aber es sollte heissen:
1 | |
was bedeutet: solange string-Ende nicht erreicht und Zeichen keine Ziffer...
Gast
#3289763
bedenke 0 != NULL
Hallo, ja, ich hatte mich vertippt. Vielen Dank! :) Gruß Chris
Gast
#3289770
Genau genommen bedeutet der Ausdruck "solange der Zeiger stringWithInt auf keine Ziffer zeigt und noch nicht terminiert ist, bewege ihn um ein Zeichen weiter". D.h. tail zeigt auf das Ende des Strings oder auf die erste Ziffer, sofern der String denn eine enthält. Und ob da nun A && B steht oder B && A ist in diesem Beispiel egal, die Ausdrücke sind equivalent. Nur wenn A oder B ihrerseits auf Daten operieren oder Funktionen aufrufen, muss man genauer hinsehen.
Gast
#3289772
Michael Reinelt schrieb: > ich vermute aber es sollte heissen:while((*stringWithInt!=0) && > !isdigit(*stringWithInt))) Ahhh, stimmt, in dem Originalpost fehlt wohl eine Dereferenzierung... nicht gesehen ^^
Gast
#3289778
SpieleJupp schrieb: > bedenke 0 != NULL Faaaaalsch! "bool isThatReallyTrue = (0 != NULL);" ergibt FALSE....
Gast
#3289781
Hallo Chris, Du solltest den Adresse allerdings erst nach der Zuweisung erhöhen, da ansonsten die Prüfung keinen Sinn ergibt. tail=stringWithInt; stringWithInt++; Gruss RomanK
Gast
#3289796
Hippie schrieb: > Faaaaalsch! > "bool isThatReallyTrue = (0 != NULL);" > ergibt FALSE.... Ich dachte immer Null entspricht dem Zeichen 0x0 und "0" dem Zeichen 0x60. Stimmt das was Hippie schreibt?
Gast
#3289799
SpieleJupp schrieb: > Hippie schrieb: >> Faaaaalsch! >> "bool isThatReallyTrue = (0 != NULL);" >> ergibt FALSE.... > > Ich dachte immer Null entspricht dem Zeichen 0x0 und "0" dem Zeichen > 0x60. > Stimmt das was Hippie schreibt? Ja, im Grunde stimmt es. Nur kann man einen Pointer sowohl auf 0 als auch auf NULL prüfen. Aber korrekt ist NULL bei Pointer und 0 bei z.B. Zeichenketten Terminierung. 0x60 steht für das Zeichen 0, also '0' oder char a = '0'. Grüsse, René
Gast
#3289806
SpieleJupp schrieb: > bedenke 0 != NULL Und wie lautet die Deklaration von NULL?
Gast
#3289809
NULL ist ein Makro. (void*)0 Grüsse, René
Alex schrieb: > Und ob da nun A && B steht oder B && A ist in diesem Beispiel egal, die > Ausdrücke sind equivalent. Nur wenn A oder B ihrerseits auf Daten > operieren oder Funktionen aufrufen, muss man genauer hinsehen. Achtung, das ist ganz und gar nicht egal! Da Der Compiler die sogenannte "short circuit evaluation" anwendet, wird bei A && B B erst gar nicht ausgewertet, wenn A schon falsch ist. Beispiel:
1 | |
2 | |
wenn du das drehst zu
1 | |
kriegst eine NULL pointer dereferenzierung
Rene H. schrieb: > Ja, im Grunde stimmt es. Nur kann man einen Pointer sowohl auf 0 als > auch auf NULL prüfen. Aber korrekt ist NULL bei Pointer und 0 bei z.B. > Zeichenketten Terminierung. Man kann auch einen Pointer auf 0 prüfen. Sollte der Nullpointer intern (maschinenabhängig) eine andere Repräsentation haben, ist es Aufgabe des Compilers, das zu ersetzen. Die Verwendung von NULL verdeutlicht das nur optisch, semantisch ist es kein Unterschied.
Gast
#3289827
Fabian O. schrieb: > Die Verwendung von NULL verdeutlicht das nur > optisch, semantisch ist es kein Unterschied. Ja, sagte ich doch. Nur ist es so, dass manche Compiler bei 0 eine Warnung werfen. Deswegen hat das Makro NULL den void* cast. Grüsse, René
Rene H. schrieb: > 0x60 steht für das Zeichen 0, also '0' oder char a = '0'. In welchem Zeichensatz bitte? In ASCII, das immerhin die gemeinsame Ursuppe von DOS_CP437, Windows "ANSI" CP1251, ISO8859-1 und auch UTF-8 ist, ist das Zeichen (die Ziffer) '0' mit 0x30 codiert. 0x60 ist '`', der Accent grave bzw. das "backtick"
Gast
#3289876
Rufus Τ. Firefly schrieb: > Rene H. schrieb: >> 0x60 steht für das Zeichen 0, also '0' oder char a = '0'. > > In welchem Zeichensatz bitte? > > In ASCII, das immerhin die gemeinsame Ursuppe von DOS_CP437, Windows > "ANSI" CP1251, ISO8859-1 und auch UTF-8 ist, ist das Zeichen (die > Ziffer) '0' mit 0x30 codiert. > > 0x60 ist '`', der Accent grave bzw. das "backtick" Stimmt. man ascii hat geholfen :-). Es ist Oktal 060. Grüsse, René
Gast
#3291659
Rene H. schrieb: > Fabian O. schrieb: >> Die Verwendung von NULL verdeutlicht das nur >> optisch, semantisch ist es kein Unterschied. > > Ja, sagte ich doch. Nur ist es so, dass manche Compiler bei 0 eine > Warnung werfen. Deswegen hat das Makro NULL den void* cast Den muss es aber nicht haben. Es darf auch einfach
1 | |
sein, oder sogar
1 | |
In GCC ist es oft definiert als:
1 | |
Und __null ist dann das gleiche wie 0, erzeugt aber bei Verwendung außerhalb von Zeiger-Kontexten eine Warnung. Rene H. schrieb: > Stimmt. man ascii hat geholfen :-). Es ist Oktal 060. Über die Oktal-Angaben in der ascii-man-Page bin ich auch schon mal gestolpert. ;-) Rene H. schrieb: > Fabian O. schrieb: >> Die Verwendung von NULL verdeutlicht das nur optisch, semantisch ist es >> kein Unterschied. > > Ja, sagte ich doch. Naja, du sagtest; Rene H. schrieb: > Aber korrekt ist NULL bei Pointer und 0 bei z.B. Zeichenketten > Terminierung. Tatsächlich ist 0 bei Pointern genauso korrekt wie bei der Terminierung. Empfohlen werden aber meistens für Zeiger NULL und für die Terminierung '\0', da beides den Kontext besser verdeutlicht.
Gast
#3292778
Michael Reinelt schrieb: > Achtung, das ist ganz und gar nicht egal! Da Der Compiler die sogenannte > "short circuit evaluation" anwendet, wird bei A && B B erst gar nicht > ausgewertet, wenn A schon falsch ist. Nennt sich Sequence Point und sollte hoffentlich von jedem Compiler umgesetzt werden. GCC macht es zumindest. Gruss und scheeenes Schaffen :)
Jean Player schrieb: > Nennt sich Sequence Point Nein, das hat mit Sequenzpunkten nichts zu tun.
Interessant in diesem Kontext ist auch, dass bei !isdigit(*stringWithInt)&&(stringWithInt!=0) der hintere Teil vom Compiler nicht ausgewertet werden muss. Da im ersten Ausdruck der Pointer dereferenziert wird und das für Null-Pointer nicht erlaubt ist, darf der Compiler annehmen, dass der zweite Ausdruck immer wahr ist. Also gut aufpassen was man tut. Durch derartige Fehler sind schon genug Sicherheitsprobleme aufgetreten. So, das war jetzt genug OT. :-)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.