2 Stimmen

Brauche Hilfe, um ein seltsames C-Verhalten zu verstehen

Dieser Teil meines Codes funktioniert einwandfrei:

#include <stdio.h>

int main(){
    //char somestring[3] = "abc";
    int i, j; 
    int count = 5;

    for((i=0) && (j=0); count > 0; i++ && j++){
        printf("i = %d  and j = %d\n", i, j);
        count--;
    }

    return 0;
}

Die Ausgabe erfolgt wie erwartet:

i : 0 and j : 0
i : 1 and j : 1
i : 2 and j : 2
i : 3 and j : 3
i : 4 and j : 4

Die Dinge werden seltsam, wenn ich die Deklaration der Zeichenkette in der ersten Zeile des Funktionskörpers auskommentiere.

#include <stdio.h>

int main(){
    char somestring[3] = "abc";
    ...
}

Das Ergebnis:

i : 0 and j : 4195392
i : 1 and j : 4195393
i : 2 and j : 4195394
i : 3 and j : 4195395
i : 4 and j : 4195396

Was ist die Logik dahinter? Ich bin mit gcc 4.4.1 auf Ubuntu 9.10.

18voto

RichieHindle Punkte 256891

j wird nie initialisiert, weil die Kurzschlussverhalten de && . Seit (i=0) wird als false ausgewertet, (j=0) wird nie ausgeführt, und daher j erhält einen Zufallswert. Im ersten Beispiel ist dieser zufällig gleich Null.

Sie sollten sagen i=0, j=0 um zu erreichen, was Sie wollen.

En i++ && j++ hat das gleiche Problem; es sollte sein i++, j++ .

Auch das:

char somestring[3] = "abc";

reserviert wegen des NUL-Zeichens am Ende der Zeichenkette ein Byte zu wenig - Sie benötigen vier Bytes. Wenn Sie die Zeichenkette nicht ändern, müssen Sie die Anzahl der Bytes nicht angeben, sondern können einfach Folgendes sagen:

char *somestring = "abc";

stattdessen.

2voto

Juri Robl Punkte 5354

Wenn Sie && verwenden, wird nur das erste Argument ausgewertet, wenn es falsch ist. i=0 ist falsch, also wird j nicht auf 0 gesetzt. Sie sollten den komma-Operator verwenden:

for((i=0) , (j=0); count > 0; i++, j++){ [...]

1voto

Vlad Punkte 34235

for((i=0) && (j=0)... scheint bereits falsch zu sein.
i=0 hat bereits den Wert 0, so dass die Auswertung von j=0 ist nicht erforderlich und wird daher übersprungen.

(i++) && (j++) scheint aus demselben Grund auch für die allererste Iteration falsch zu sein.

0voto

Jason Williams Punkte 55292

Sie verwenden (i==0) && (j==0) um beide Variablen in Ihrer Schleife zu initialisieren.

Eine Eigenschaft von && ist jedoch, dass der zweite Operand nie ausgeführt wird, wenn der erste Operand zu FALSE (d.h. 0) ausgewertet wird. Da i also 0 ist, bleibt j uninitialisiert. In Ihrem ersten Durchlauf haben Sie einfach Glück dass er zufällig den Wert 0 enthält.

0voto

stacker Punkte 65961

Ihre Variablen i und j sind nicht initialisiert. Was meinen Sie mit (i=0) && (j=0) ? Der Compiler macht eine Abkürzung und weist nur i=0 j bleibt uninitialisiert mit dem von Ihnen beschriebenen Effekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X