2012-09-24 12 views
5

Was ist die Reihenfolge der Auswertung in C im Fall von x<<y>>z? Ist es (x<<y)>>z, wegen der Links-Rechts-Assoziativität?x <<y>> z Reihenfolge der Auswertung in C

BEARBEITEN Sie müssen wissen, was die Standards dazu sagen, und nicht raten, was bei der Inspektion für einen bestimmten Compiler passiert.

+6

Haben Sie es versucht? Was du hast? –

+0

@ AurelioDeRosa: Versucht hier: http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx. Aber ich war mit der Zeile verwechselt: "Reihenfolge der Operationen ist nicht durch die Sprache definiert" – phoxis

+4

@ AurelioDeRosa: Auch wenn Sie es versuchen, wie wissen/beweisen Sie, dass Ihr Compiler standardkonform ist? –

Antwort

3

Online C 2011 Draft Standard (N1570)

 
6.5.7 Bitwise shift operators 

Syntax 

1  shift-expression: 
      additive-expression 
      shift-expression << additive-expression 
      shift-expression >> additive-expression 

Die Syntax zeigt beide Operatoren sind linksassoziativ, wie folgt:

 
    x  <<  y   >>   z 
    |    |   |   | 
    +------ + ------+   |   | 
      |     |   | 
      V     |   V 
     shift-expression  >> additive-expression 

+1

+1 für die BNF . –

5

Ja, >> und << sind assoziativ links und von dem gleichen Vorrang, so sind x <<y>> z-(x << y) >> z gleichwertig.

-1

Yep ist es, aber ich denke, es ist sicherer in 2 Schritten zu tun, wie x<<y dann y>>z Ursache der Compiler kann schlecht interpretieren x<<y>>z. Ich habe seit einer ganzen Zeit keine bitweisen Operationen verwendet, aber wenn ich mich gut erinnere, ist es das, was ich gesagt habe. Ich hoffe, ich habe dir geholfen.

+0

Vielen Dank für die Bearbeitung, habe meine Fehler nicht gesehen. Entschuldigung für das OP. –

+0

der Compiler kann es nicht schlecht interpretieren (nahe 0 Chance für einen Fehler, Reihenfolge der Auswertung ist eine wirklich grundlegende Sache) –

+0

Ich habe diesen Fehler auch gesehen (weiß nicht, was durch mein Gehirn ging) –

Verwandte Themen