Forum: PC-Programmierung Was bedeutet (*stringWithInt!=0)?


von Christian S. (chris72160)


Lesenswert?

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

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

so wie es da steht, heisst es "solange der Zeiger nicht NULL ist"

ich vermute aber es sollte heissen:
1
while((*stringWithInt!=0) && !isdigit(*stringWithInt)))

was bedeutet: solange string-Ende nicht erreicht und Zeichen keine 
Ziffer...

von SpieleJupp (Gast)


Lesenswert?

bedenke 0 != NULL

von Christian S. (chris72160)


Lesenswert?

Hallo,

ja, ich hatte mich vertippt.

Vielen Dank! :)

Gruß Chris

von Alex (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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 ^^

von Hippie (Gast)


Lesenswert?

SpieleJupp schrieb:
> bedenke 0 != NULL

Faaaaalsch!
"bool isThatReallyTrue = (0 != NULL);"
ergibt FALSE....

von RomanK (Gast)


Lesenswert?

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

von SpieleJupp (Gast)


Lesenswert?

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?

von Rene H. (Gast)


Lesenswert?

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é

von Neugierde (Gast)


Lesenswert?

SpieleJupp schrieb:
> bedenke 0 != NULL

Und wie lautet die Deklaration von NULL?

von Rene H. (Gast)


Lesenswert?

NULL ist ein Makro.

(void*)0

Grüsse,
René

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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
char *a;
2
if (a != NULL && *a != irgendwas)

wenn du das drehst zu
1
if (*a != irgendwas && a != NULL)
kriegst eine NULL pointer dereferenzierung

von Fabian O. (xfr)


Lesenswert?

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.

von Rene H. (Gast)


Lesenswert?

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é

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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"

von Rene H. (Gast)


Lesenswert?

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é

von Rolf Magnus (Gast)


Lesenswert?

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.

von Jean Player (Gast)


Lesenswert?

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 :)

von Stefan R. (srand)


Lesenswert?

Jean Player schrieb:
> Nennt sich Sequence Point

Nein, das hat mit Sequenzpunkten nichts zu tun.

von Hermann K. (r2d2)


Lesenswert?

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. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.