2015-01-02 3 views
12

ich einen Code wie dieses:machen die Bedeutung von/* für dereferenzieren und nicht zur Kommentierung Dividieren durch einige Sonderzeichen Hinzufügen

int quotient = 100/*ptr; 

wo ptr ein Zeiger auf interger ist.

Aber es ist /* als Kommentar.
Wie kann ich die Bedeutung von dividieren durch Zeiger Dereferenzwert machen? Welchen besonderen Charakter muss ich haben, um diese Bedeutung zu haben?

+17

Diese Frage scheint off-topic zu sein, weil OP sollte besser wissen und nur um binäre arithmetische Operatoren Leerzeichen setzen. – Griwes

+0

Wenn ein Leerzeichen zwischen dem '/' und dem '*' nicht funktioniert, setzen Sie parens um den Divisor, so: 'int quotient = 100/(* ptr);' – user3629249

+1

Ich denke, Off-Topic-Tag ist nicht korrekt. Aber ich bin OK mit etwas wie OP hat nicht genug Forschung oder so getan :) – InQusitive

Antwort

33

Dies geschieht, weil die Sprache die Token wieder zu verwenden versucht. (* in diesem Fall)

Lösung ist, einen Abstand zwischen / und * zu setzen, um maximalen Munch zu schlagen.

int quotient = 100/*ptr; 

Eine andere Möglichkeit ist es, eine Klammer oder verwenden Sie eine andere lokale Variable hinzuzufügen:

int quotient = 100/(*ptr); 
13

ändern es dazu:

int quotient = 100/(*ptr); 

oder

int quotient = 100/ *ptr; 

/*zusammen für mehrzeilige Kommentare in fast allen Sprachen verwendet wird, die ich bis jetzt weiß.

+0

Das können dann nicht viele Sprachen sein :) Und das OP weiß bereits, dass es die "Kommentar" -Sequenz ist. – usr2564301

13

C und C++ maximal munch rule verwenden, um die Token zu analysieren. Die längste gültige Übereinstimmungszeichenfolge nach einem Token wird das nächste Token sein.

daher in int quotient = 100/*ptr;, /* wird / und * statt zwei Token ein einzelnes Token sein. Dies ist ein unerwünschter Effekt der Regel.

In einigen Situationen führt "maximales Munch" zu unerwünschten oder nicht intuitiven Ergebnissen. Zum Beispiel wird in der Programmiersprache C die Anweisung x=y/*z; (ohne Leerzeichen) wahrscheinlich zu einem Syntaxfehler führen, da die /* Zeichensequenz einen (nicht beabsichtigten) Kommentar einleitet, der entweder nicht abgeschlossen ist oder durch das Ende Token */ von einigen später beendet wird , nicht verwandter aktueller Kommentar (Kommentare in C verschachteln nicht). Was in der Anweisung tatsächlich gemeint war, war, der Variablen x das Ergebnis der Division des Wertes in y durch den Wert zuzuweisen, der durch Dereferenzieren des Zzeigers erhalten wurde; Dies wäre ein vollkommen gültiger (wenn auch nicht sehr gebräuchlicher) Code. Es kann unter Verwendung von Leerzeichen oder unter Verwendung von x=y/(*z); angegeben werden.

https://en.wikipedia.org/wiki/Maximal_munch#Drawbacks

dies beheben Sie nur einen Raum hinzufügen müssen, neue Zeile oder einen anderen Dummy-Token (wie ein Kommentar) / und * zu trennen.Sie können auch den Ausdruck von Klammern wie in der anderen Antwort umgeben

int quotient = 100/ /* this will work */ *ptr; 
int quotient = 100/ 
    *ptr; // this will also work 

Eine ähnliche Frage: Why doesn't a+++++b work in C?

+0

Gibt es einen Grund für den Downvote? –

+1

'int quotient = 100 // * das funktioniert in C89 aber nicht in C++ und C99 + */* ptr;' –

+1

@DonaldDuck hast du meine Antwort gelesen? 'Um dies zu beheben, müssen Sie nur ein Leerzeichen, eine neue Zeile oder ein Dummy-Token hinzufügen (wie einen Kommentar), um zu trennen/und *' –

25

Zuerst Sie *ptr mit ptr[0] ersetzen können, da beide die gleiche Semantik haben:

int quotient = 100/ptr[0]; 

Und da Arrayindizierung kommutativ ist, können Sie die Operanden tauschen:

int quotient = 100/0[ptr]; 

Für den gelegentlichen Leser kann dies wie Division durch Null aussehen, aber [] hat natürlich höhere Priorität als /. Vielleicht möchten Sie es, einen Raum setzen, nur für den Fall:

int quotient = 100/0 [ptr]; 

Glückwunsch, Sie haben jetzt einen Job für das Leben!

+17

'[' und ']' kann für einige Leute schwierig zu pflegen sein, so schlage ich vor '<:' and ':>' stattdessen. – rightfold

+1

@righrfold warum ersetzen Sie letzteres nicht mit '??)' so haben Sie 'int quotient = 100/0 <: ptr ??)'. so können sogar C-Programmierer es lesen. – 12431234123412341234123

Verwandte Themen