2016-12-17 2 views
0

Ich habe einen Ausdruck Parser geschrieben, der eine Reihe von Assembler-Anweisungen für x86, x64 und ARM ausspuckt.GCC C++ Warnung: vorschlagen Klammern

Um es zu testen Ich habe eine kleine App geschrieben, die zufällige Ausdrücke generiert, kompiliert sie mit GCC und vergleicht das Ergebnis mit meinem Code, so weit so gut.

Jetzt möchte ich, dass mein Parser ähnliche Warnungen wie GCC erzeugt.

Ich habe bemerkt, dass mit GCC 5.1.0

int a = 100 + 100 | 10; 

GCC Warnung um ein vorgeschlagenes Klammern geben |

aber

int b = 100 * 100 | 10; 

GCC gibt keine Warnung.

aber sowohl Addition als auch Multiplikation haben höhere Priorität als bitweises OR, also warum keine Warnung auf dem int b = Ausdruck?

Ich bin sehr müde lol so kann etwas übersehen haben.

+4

Persönlich würde ich Klammern für beide verwenden, nur um klar zu machen, was passiert –

+0

Siehe https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses- 201 –

+0

Persönlich würde ich keine Klammern für beide verwenden, und ich würde es sicherlich als völlige Unverschämtheit für einen Compiler betrachten, eine redundante Syntax hinzuzufügen. – EJP

Antwort

1

Die ultimative Antwort kann nur kommen aus die Implementierer, aber ich vermute, der Grund ist, dass es andere Sprachen gibt, die unterschiedliche Präferenzen dieser Operatoren haben, und daher Benutzer dieser anderen Sprachen den Ausdruck möglicherweise falsch interpretieren.Ein Beispiel hat in some Pascal dialects,& die gleiche Priorität wie * und | hat das gleiche Vorrang als +, also ein Ausdruck, der sowohl + als auch | miteinbezieht t Klammern dazwischen können eine andere Interpretation haben (Standard Pascal hat keine & oder |, aber die Präzedenz von and und or in Standard Pascal folgt den gleichen Regeln). Ich schätze, dass genau wie viele Sprachen die Priorität des C-Operators kopiert wird, andere kopieren den Pascal-Operator.

2

Dies ist Sache der Precedence, * ist Priorität 5, + 6 und | ist 12.

Also, wenn Sie eine Warnung von einem bekommen, aber nicht von dem anderen haben Sie eine Compiler Inkonsistenz gefunden. Oder die Compiler hat eine Regel, die sagt, wenn (priorityDifference (X, Y) < 7 Anzeige PARENTESIS Warnung, die keinen Sinn macht.

Beitrag eine Fehlermeldung über Ihre Version.

+1

Ich denke nicht, dass ein Fehler überhaupt ist. Dies ist unter https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Wparentheses-201 -Weparenthes (in -Wall enthalten) –

+0

@CaptainGiraffe, ja das deckt es, aber in dem spezifischen Unterschied hier, warum sollten Menschen mehr (oder weniger) verwirrt durch die '*' im Gegensatz zu '+'? – Surt

+1

Nein, das ist kein Bug! Weil der Vorrang wichtig ist. Dies mischt arithmetische und bitweise Operatoren! Anwenden bitweises OR auf das Ergebnis von zwei Ints oder Int-Ausdrücke ist nicht ungewöhnlich. Mathe mit dem Ergebnis eines bitweisen ODER zu tun ist wirklich seltsam. – geipel

0

Nach dem Kommentar von celtschk lesen, habe ich versucht, ein paar Ausdrücke in C++ und frei pascal

C++

a = 100 + 100 & 100; // = 64 
    a = (100 + 100) & 100; // = 64 

Free Pascal

a := 100 + 100 and 100; // = 200 
    a := (100 + 100) and 100; // = 64 

Free Pascal

a := (100 + 100) and 222; // = 200 
    a := 100 + 100 and 222; // = 168 

// C++

a = 100 * 100 & 222; // = 16 

// Free Pascal

a := 100 * 100 and 222; // = 16 

So wäre es Bitoperatoren in anderen Sprachen scheinen die gleiche Priorität wie in C++ nicht haben, die Kopfschmerzen verursachen würde, wenn zwischen den Sprachen zu übersetzen. Vielleicht könnte die Warnmeldung, die von GCC produziert wurde, ein bisschen beschreibender sein.

Verwandte Themen