Kürzlich cppcheck hob einen Fehler in C-Code, das die Struktur:Ist die Reihenfolge der Auswertung mit Kommaoperator & Zuweisung in C vorhersagbar?
((void)(value_prev = value), value = new_value())
In den meisten Fällen kann dies auf zwei Zeilen verteilt werden, jedoch gibt es einige Fälle, dies ist nützlich in einer einzigen Anweisung zu haben.
In der Praxis fand ich, dass dies mit populären Compilern (GCC/Clang/MSVC) funktioniert, die keine Warnungen geben (sogar mit Warnstufen auf ihren höchsten).
Beispielcode:
#include <stdio.h>
int get_next(int i);
int main() {
int i = 0, i_prev = 10;
do {
printf("%d\n", i);
} while ((void)(i_prev = i),
(i = get_next(i)) != 10);
}
cppcheck 1,73 (letzte zum Zeitpunkt des Schreibens) einen Fehler mit diesem Code gibt:
(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10'
depends on order of evaluation of side effects`
Während der Code zu beruhigen könnte geändert werden Die Warnung, ist die Reihenfolge wirklich undefiniert?
Könnte es sein, dass get_next (i) ein Makro ist, wie #define getnext (i) i ++? – gnasher729
Nein, in diesem Fall ist es als eine Funktion definiert, cppcheck gibt den Fehler in diesem Code ohne irgendwelche Änderungen. – ideasman42