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
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.
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 ^^
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
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?
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é
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:
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.
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"
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é
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
#define NULL 0
sein, oder sogar
1
#define NULL (3*4/20)
In GCC ist es oft definiert als:
1
#define NULL __null
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.
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 :)
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. :-)