E 'facile vedere che:Le operazioni logiche su più operazioni modulo sono ottimizzate?
(i % 3 == 0) && (i % 5 == 0)
può essere semplificata:
(i % 15 == 0)
Eppure esaminando l'output di GCC, sembra che questo non è fatto anche ad alti livelli di ottimizzazione.
Alcuni compilatori eseguono questo tipo di ottimizzazioni oppure esiste una buona ragione per cui questi due test non sono semanticamente equivalenti?
Edit: In risposta a chi dice che questo è un caso frangia, il seguente è un caso simile:
(i < 3) && (i < 5)
Qualsiasi numero minore di 3, deve essere sempre inferiore a 5. Secondo test è ridondante.
Vorrei anche aggiungere quanto segue in risposta alla risposta che il compilatore non può sapere se l'ambiente è interessato ... Guardate questo codice:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
funzione intero si riduce a "repz ret "di GCC con -O2
. È molto più complesso di qualsiasi cosa di cui sto parlando.
la mia ipotesi è di garantire la valutazione del cortocircuito ... – Anycorn
I compilatori in generale controllano confronti multipli sulla stessa variabile per l'ottimizzazione? Sembra un caso marginale ... – trutheality
@Anycorn, stai dicendo che la valutazione di 'i' può avere effetti collaterali, e il compilatore non fa se lo fa o no? – ikegami