Recentemente cppcheck sollevato un errore nel codice C, che ha la struttura:L'ordine di valutazione con operatore e assegnazione di virgola in C è prevedibile?
((void)(value_prev = value), value = new_value())
Nella maggior parte dei casi questo può essere divisa su 2 righe, tuttavia ci sono alcuni casi questo è utile avere in una singola istruzione.
In pratica ho trovato questo funziona con compilatori popolari (GCC/Clang/MSVC), che non danno alcun avviso (anche con livelli di avviso impostati al massimo). Codice
Esempio:
#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 (più tardi al momento della scrittura) dà un errore con questo codice:
(error) Expression '(void)(i_prev=i),(i=get_next(i))!=10'
depends on order of evaluation of side effects`
Mentre il codice potrebbe essere cambiato a quietarmi l'avvertimento, l'ordine è davvero indefinito?
Potrebbe essere che get_next (i) è una macro, come #define getnext (i) i ++? – gnasher729
No, in questo caso è definito come una funzione, cppcheck restituisce l'errore su questo codice senza alcuna modifica. – ideasman42