2009-12-16 11 views
7

ho appena scritto la seguente riga di codice:corretto utilizzo del operatore di pre-incremento, in combinazione con l'operatore puntatore dereference

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1 

Il mio intento è quello di incrementare la variabile count all'interno della struttura dati che data_ptr punta a prima di effettuare il confronto su threshold, e questa linea di codice funziona.

Se avessi invece voluto incrementare data_ptr prima di effettuare il confronto, avrei scritto questo:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2 

Per curiosità, ho provato anche questa riga di codice:

if (++data_ptr->count > threshold) { /*...*/ } // example 3 

E trovato che si comporta esattamente come il primo.

Prima domanda:Perché fa esempio # 3 funzionano come ad esempio # 1? È una questione di precarietà dell'operatore? Qualcosa nello standard? Ho dovuto scrivere un programma di test rapido perché la risposta non era ovvia per me.

Seconda domanda: Devo scrivere questa dichiarazione if in modo diverso? Potrei eseguire prima l'incremento, sulla sua linea, e quindi verificare la condizione per evitare ogni possibile confusione. È necessario, o i primi due esempi sono abbastanza evidenti da soli?

risposta

11

1) Precedenza

2) Preferenza

+3

+1 succinta. '' –

3
  1. L'operatore -> si lega più stretto di ++.
  2. Sono entrambi ben definiti e penso che siano facili da leggere. Le cose sarebbero guai se avessi riferimenti aggiuntivi a data_ptr nella stessa espressione.
5

Sì, questa è una questione di precedenza degli operatori. L'operatore di freccia has higher precedence rispetto all'operatore di incremento.

Per rispondere alla tua seconda domanda, vorrei generalmente separare questo tipo di costruire fuori in due prospetti separati:

++(data_ptr->count); 
if(data_ptr->count > threshold) { /*...*/ } 

Questo sottolinea che cosa sta succedendo ed elimina possibili confusioni. Tuttavia, questa è probabilmente una questione di preferenza.

5
  1. precedenza degli operatori determina il comportamento si osserva.
  2. Non sarebbe male se si separasse l'incremento dal confronto in questo esempio, ma a volte si desidera avere una condizione con incremento nel mezzo di una sequenza di condizioni e quindi provare a separare l'incremento dal test può danneggiare la leggibilità del codice introducendo il nesting che altrimenti non sarebbe necessario.

Ad esempio:

if (...1...) 
    ...2... 
else if (++data_ptr->count > threshold) 
    ...3... 
else 
    ...4... 

Versus:

if (...1...) 
    ...2... 
else 
{ 
    ++data_ptr->count; 
    if (data_ptr->count > threshold) 
     ...3... 
    else 
     ...4... 
} 
Problemi correlati