ordnungsgemäße Verwendung des Vor-Inkrements-Operators in Kombination mit dem Zeiger Dereferenzoperator

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

Frage

Ich habe gerade die folgende Codezeile geschrieben:

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

Meine Absicht ist es, die zu erhöhen count Variable innerhalb der Datenstruktur, die data_ptr zeigt auf, bevor Sie den Vergleich mit threshold, und diese Codezeile funktioniert.

Wenn ich stattdessen inkrementieren wollte data_ptr Vor dem Vergleich hätte ich Folgendes geschrieben:

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

Aus Neugier habe ich auch diese Codezeile ausprobiert:

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

Und stellte fest, dass es sich genauso verhält wie der erste.

Erste Frage: Warum Funktioniert Beispiel 3 genauso wie beispielsweise Nr. 1? Ist es eine Frage der Bedienerpräsentation? Etwas im Standard? Ich musste ein kurzes Testprogramm schreiben, weil die Antwort mir nicht offensichtlich war.

Zweite Frage: Soll ich das schreiben if Aussage anders? Ich könnte das Inkrement zuerst in seiner eigenen Linie durchführen, und dann Testen Sie den Zustand, um mögliche Verwirrung zu vermeiden. Ist dies notwendig oder sind die ersten beiden Beispiele für sich selbst offensichtlich genug?

War es hilfreich?

Lösung

1) Vorrang

2) Präferenz

Andere Tipps

Ja, dies ist eine Frage des Vorrangs der Bediener. Der Pfeilbetreiber hat höhere Vorrang als der Inkrementoperator.

Um Ihre zweite Frage zu beantworten, würde ich diese Art des Konstrukts im Allgemeinen in zwei separate Aussagen trennen:

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

Dies betont, was los ist, und beseitigt mögliche Verwirrung. Dies ist jedoch wahrscheinlich eine Frage der Präferenz.

  1. Der Vorrang vor dem Operator bestimmt das von Ihnen beobachtete Verhalten.
  2. Es würde nicht viel schaden, wenn Sie das Inkrement von dem Vergleich in diesem Beispiel getrennt hätten, aber manchmal möchten Sie einen Zustand mit Inkrement in der Mitte einer Abfolge von Bedingungen haben, und dann kann versuchen, das Inkrement vom Test zu trennen Die Lesbarkeit des Codes durch Einführung von Verschachteln, die ansonsten unnötig wäre.

Zum Beispiel:

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

Gegen:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
  1. Der -> Operator bindet enger als ++.
  2. Sie sind beide gut definiert und ich denke, sie sind leicht zu lesen. Die Dinge würden nur zwielichtig, wenn Sie im selben Ausdruck zusätzliche Verweise auf Data_PTR hätten.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top