Gibt es einen Grund, * & oder & * im C-Code zu verwenden? [geschlossen]

8

Ich bin auf einen C-Code gestoßen, der die Operatoren " * " und " & " gleichzeitig verwendet, wie &*foo und *&bar . Ich bin verwirrt. Gibt es einen Grund, dies zu tun?

    
M. Baum 01.07.2016, 19:05
quelle

3 Antworten

15

Ja, sie können sinnvoll verwendet werden: Ein gültiger Anwendungsfall ist in Makrodefinitionen, um zu überprüfen, ob das Makroargument den Anforderungen entspricht.

&*foo überprüft, ob foo ein Zeigertyp ist (möglicherweise nach einer impliziten Konvertierung aus einem Array oder einem Funktionstyp).

*&foo überprüft, dass foo ein lvalue-Ausdruck ist.

Zum Beispiel, ein Beispiel, so einfach, dass es ein bisschen Makro-Missbrauch sein könnte:

%Vor%     
hvd 01.07.2016 19:10
quelle
2

Der einzige sinnvolle Grund dafür ist, den Ausdruck nicht mehr als lvalue zu behandeln.

Zitat C11 , Kapitel §6.5.3.2

  

Der unäre Operator & gibt die Adresse seines Operanden an. Wenn der Operand den Typ '' type '' hat,   Das Ergebnis hat den Typ '' Zeiger auf den Typ '' . Wenn der Operand das Ergebnis eines unären * Operators ist,   Weder dieser Operator noch der Operator & werden ausgewertet, und das Ergebnis ist so, als wären beide   entfällt, außer dass die Einschränkungen für die Operatoren weiterhin gelten und das Ergebnis kein lvalue ist.

    
Sourav Ghosh 01.07.2016 19:12
quelle
0
  1. &*ptr enthält einen Hinweis für den Compiler, dass ptr != NULL (da sonst *ptr ein undefiniertes Verhalten bedeuten würde).

  2. *& kann einfach das Ergebnis einer Wartungsänderung sein, bei der eine Hilfszeigervariable eliminiert wurde:

    %Vor%

    Einfaches Ersetzen im obigen Code ip mit &x.i führt zu Code, der eine solche Frage auf StackOverflow entstehen lässt:

    %Vor%
  3. Auf ähnliche Weise kann &* durch eine Refactoring-Änderung eingeführt werden, die lvalue durch einen Zeiger ersetzt hat.

    Vor dem Refactoring:

    %Vor%

    Nach dem Extrahieren des Server-Setup-Codes in eine eigene Funktion:

    %Vor%
Leon 03.07.2016 20:29
quelle