Utilizzo corretto dell'operatore di pre-incremento in combinazione con l'operatore di dereference del puntatore

StackOverflow https://stackoverflow.com/questions/1918021

Domanda

Ho appena scritto la seguente riga di codice:

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

Il mio intento è di incrementare il count variabile all'interno della struttura dei dati che data_ptr indica prima di fare il confronto con threshold, e questa riga di codice funziona.

Se invece avessi voluto incrementare data_ptr Prima di fare il confronto, avrei scritto questo:

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

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

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

E ha scoperto che si comporta esattamente come il primo.

Prima domanda: Perché L'esempio n. 3 funziona allo stesso modo dell'esempio n. 1? È una questione di precence dell'operatore? Qualcosa nello standard? Ho dovuto scrivere un rapido programma di test perché la risposta non era ovvio per me.

Seconda domanda: Dovrei scrivere questo if dichiarazione diversamente? Potrei eseguire prima l'incremento, sulla propria linea e poi Prova la condizione per evitare qualsiasi possibile confusione. È necessario o i primi due esempi sono abbastanza ovvi da soli?

È stato utile?

Soluzione

1) Precedenza

2) Preferenza

Altri suggerimenti

Sì, questa è una questione di precedenza dell'operatore. L'operatore freccia ha una precedenza maggiore rispetto all'operatore di incremento.

Per rispondere alla tua seconda domanda, generalmente separerei questo tipo di costrutto in due dichiarazioni separate:

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

Ciò sottolinea ciò che sta accadendo ed elimina la possibile confusione. Tuttavia, questa è probabilmente una questione di preferenza.

  1. La precedenza dell'operatore determina il comportamento che hai osservato.
  2. Non farebbe molto male se si separa 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 il Leggibilità del codice introducendo nidificazione che altrimenti non sarebbe necessario.

Per esempio:

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

Contro:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
  1. L'operatore -> si lega più stretto di ++.
  2. Sono entrambi ben definiti e penso che siano facili da leggere. Le cose diventerebbero ingannevoli solo se avessi ulteriori riferimenti a data_ptr nella stessa espressione.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top