Domanda

Innanzitutto, prima di iniziare, utilizzo VC++ 2008 Professional, con un processore Intel Core2 su sistema operativo Windows.So anche che questo codice non verrà MAI eseguito su qualcosa di diverso da un core2/corei7 con Windows.

Ho un ciclo while con 2 condizioni che assomigliano a queste:Nota:questa è una versione molto semplificata.

while((a != b) && (array[a] < c))

Se la prima condizione (a != b) genera un falso, verrà valutata anche la seconda condizione?o il ciclo terminerà proprio lì?

Ho fatto qualche prova e sembra proprio che sia vero.

Tuttavia, ecco il problema.Quando e se la prima condizione risulta falsa, la seconda condizione genererà una violazione di accesso se viene valutata.Tuttavia, da quello che posso vedere, una volta che la prima condizione viene valutata come falsa, il programma non si preoccupa di valutare la seconda condizione e chiude il ciclo, salvandomi così.

Il problema è che non riesco a sbarazzarmi del problema della violazione dell'accesso senza che il mio codice molto carino e pulito improvvisamente mi esploda.Tuttavia, a causa del piccolo "bug" (so che è un'ottimizzazione del compilatore, non un bug), mi sembra di riuscire a evitarlo.So anche che probabilmente non è una buona pratica di programmazione da fare, ma ad essere sincero, nella mia situazione, se funziona, sono già in vantaggio.

La mia domanda è: questo "bug" o negligenza nella programmazione tornerà a mordermi un giorno?Anche considerando che ho testato a fondo questa sezione e LA UTILIZZERÒ SOLO UNA VOLTA?

È stato utile?

Soluzione

La seconda condizione non verrà valutata a meno che la prima non sia stata valutata come vera.Puoi contare su questo.Milioni di righe di codice funzionano perché è così che C e C++ eseguono la valutazione delle espressioni logiche a breve termine.

Puoi usarlo e contarci.Se la prima espressione risulta falsa, la seconda non lo sarà nemmeno inizio valutare.

Altri suggerimenti

Questo non è un bug.C++ utilizza la valutazione di cortocircuito, quindi la seconda condizione non verrà mai valutata quando la prima condizione è falsa.

Non verrà valutato.Tuttavia, se sei preoccupato che una routine che hai codificato possa ritorcersi contro di te, dovresti rivalutare ciò che stai scrivendo.Hai ammesso che si tratta di una cattiva pratica di programmazione.Sai già che sarà un problema.Quando queste condizioni sono soddisfatte, aggiusta la cosa.Ti odierai meno al mattino.

Il linguaggio garantisce questo comportamento di cortocircuito, quindi non dovresti preoccuparti affatto di usarlo.Funziona anche con || - Se la prima condizione è vera, la seconda non viene valutata.

Affidarsi al comportamento di cortocircuito degli operatori logici AND e OR del C++ non dovrebbe essere considerata una cattiva pratica.È perfettamente idiomatico e spesso porta a un codice più chiaro e conciso.

Per esempio.

std::auto_ptr< SomeObject > data;

Con cortocircuito &&:

// Clear expired data, if present
if( data.get() && data->expired )
    data.reset();

Senza utilizzare il cortocircuito && hai bisogno di un livello extra di if che porta a un codice più dettagliato.

// Clear expired data, if present
if( data.get() )
{
    if ( data->expired )
        data.reset();
}

La seconda condizione non verrà valutata quando la prima condizione non è vera.Come hai detto, questa ottimizzazione è seguita da tutti i compilatori C++.

Se ancora non riesci, aggiungi una semplice istruzione if nel frattempo.

while ( a != b ) {
    if ( array[a] < c )
    {
         // your code goes here.
    }
    else
    {
        break;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top