2016-03-20 15 views
0

Als Teil eines viel größeren Programms verwende ich strtok in einer while-Schleife.Verwenden von Strtok in While-Schleife; Warnung: Verwendung des Ergebnisses einer Zuweisung als Bedingung ohne Klammern

while (cmd2Args [count] = strtok (NULL, "„)) {count ++;}

Aber die folgende Warnung Warnung erhalten: das Ergebnis einer Zuweisung als Bedingung ohne Klammern [mit - Wparentheses]

Das Programm wird erfolgreich kompiliert und funktioniert wie vorgesehen. Unter welchen Umständen sollte eine solche Warnung in Betracht gezogen werden? Ist das ein schlechter Programmierstil?

Antwort

1

Ja, es ist ein schlechter Programmierstil. Wenn der Code genau so geschrieben wird, wie Sie es möchten, können Sie die Warnung ignorieren, dies ist jedoch möglicherweise nicht der Fall.

In C ist eine Zuweisung ein Ausdruck. Das bedeutet, dass der Code x = 4; nicht nur einen Wert von 4 zu x zuweist, es ist ein Wert von 4 für sich. So können Sie schreiben y = (x = 4); und Ihre y einen Wert von 4.

haben, die erzählt wird, die while Klausel muss einen Wert in den Klammern haben.

while(value) { /* loop body */ } 

Sehr oft müssen Sie in zwei Werte vergleichen, wie while(x == 42) { /* do stuff */ }. Aber was passiert, wenn Sie vergessen, ein zweites '=' zu schreiben und schreiben?

Nun, anstelle des Vergleichs haben Sie eine Aufgabe. Aber hier ist der Trick. Sie sind beide Werte (Ausdrücke, um richtig zu sein). Und während x == 42 einen Wert von 0 hat, wenn x sich von 42 unterscheidet, wird x = 42 immer einen Wert von 42 haben und den Bedingungstest bestehen.

Deshalb moderne Compiler eine Warnung setzen, wenn sie eine Zuordnung innerhalb while, if, und so weiter sehen. Wenn der Code korrekt ist und Sie wirklich die Zuweisung dort haben wollen, legen Sie einen zusätzlichen Satz von Klammern um ihn herum.

while((cmd2Args[count] = strtok(NULL, " "))) {count++} 

Das führt uns zurück in die Compilers Warnmeldung wird immer: Wenn Sie das Ergebnis einer Zuweisung als Bedingung verwenden möchten, setzen Sie Klammern um ihn herum.

Andere Art und Weise des Schreibens würde

while((cmd2Args[count] = strtok(NULL, " ")) != 0) {count++} 

sein, wo die Absicht des Programmierers ist klar.