C++ Warnung: schlagen Sie Klammern um Arithmetik in operand von |
Ich habe einen code wie
A = B|C|D|E;
Auslösen der Warnung "vorschlagen Klammern um Arithmetik in operand von |"
Erwarten, dass dieser Ausdruck muss mit hoher Priorität paranthesis für die Betreiber, versuchte Sie die folgenden Möglichkeiten:
A=(B|C)|(D|E);
einem mehr als :
A=(((B|C)|D)|E);
Immer noch die gleiche Warnung besteht weiterhin.
Bitte helfen Sie mir bei der Lösung dieses.
Dank,
Sujatha
B, C,D sind enums und E ist eine ganze Zahl.
- welche compiler verwenden Sie?
- Dein Beispiel kompiliert ohne Warnung mit GCC.
- Was sind B, C, D und E, genau?
- Sind A,B,C,D Makros?
- compiler ist gcc-4.1.2.
- Führen Sie Ihre Quell-Datei durch
gcc -E
und betrachten Sie die Ausgabe. Sind Sie absolut sicher, dass der compiler die Interpretationen von A, B, C, D, und E sind, was Sie denken, Sie sind? - kannst du die genauen compiler-Optionen, die Sie verwenden? (Auch ich kann nicht scheinen, um diese Warnung mit
gcc-4.3
mit-Wall -Wextra
)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einige arithmetische operator in Ihrem Ausdruck, ist nicht wirklich einfach B, oder, das ist nicht wirklich einfach C, usw. Der compiler ist darauf hindeutet, dass Sie parenthesize welcher Ausdruck so, dass die Leser sehen, dass Sie schrieb, was Sie meinte. Wenn Sie nicht parenthesize, jeder hat sich genau daran erinnern, was die Prioritäten sind, und Sie müssen herausfinden, wenn Sie daran erinnert, wenn Sie es schrieb.
Versuchen Sie dies: (B)|(C)|(D)|(E).
Dies ist eine seltsame Warnung. Sie nur wirklich brauchen, um die Aufmerksamkeit auf den Vorrang, wenn Sie mit verschiedenen Operatoren und die Operatoren haben unterschiedliche angigkeiten. Zum Beispiel, in der Arithmetik Multiplikation hat höhere Priorität als die addition.
Aber in diesem Fall verwenden Sie nur ein Betreiber mehrere Male. Bitweise oder-Verknüpfung ist assoziativ und kommutativ (
(A | B) | C == A | (B | C)
undA | B == B | A
) also es gibt wirklich keinen Grund für die Warnung.