Just nu i M3-nätverket
Gå till innehåll

BUG i operator precedence i 6.5


Bo Anders Svensson

Rekommendera Poster

Bo Anders Svensson

Fann vid testkörning att bitvisoperator prioriteten vid följande uttryck

 

X Y fallerade där,

 

X och Y är satser med ~, ^ och & operatorerna.

Prioriteten skall vara ~, ^, & och med fallande prioritet. Skriver man däremot

 

(X) (Y) så fungerar or-operatonr enligt specifikation.

 

 

För den som är nyfiken på att testa vad det var jag testade på så var det följande logiska uttryck:

 

~(@sa & @ua) & @nis & 0x1 , (@SA & @UA) & ~(@id ^ @nis) & 0x1

 

När jag gorde or på dessa så blev resultatet:

 

 

0000 00 0

0001 10 0

0010 00 0

0011 10 0

 

0100 00 0

0101 10 0

0110 00 0

0111 10 1

 

1000 00 0

1001 10 0

1010 00 0

1011 10 0

 

1100 01 1

1101 00 0

1110 00 0

1111 01 1

 

Använder jag paranteser runt högeroperanden för or-operatorn får jag följande resultat:

 

0000 00 0

0001 10 1

0010 00 0

0011 10 1

 

0100 00 0

0101 10 1

0110 00 0

0111 10 1

 

1000 00 0

1001 10 1

1010 00 0

1011 10 1

 

1100 01 1

1101 00 0

1110 00 0

1111 01 1

 

 

Vilket är det resultat man förväntar sig att få..

 

Programmet jag körde för att testa med:

 

declare @sa int

declare @ua int

declare @id int

declare @nis int

 

select @sa = 0

select @ua = 0

select @id = 0

select @nis = 0

 

while ((@sa & @ua & @id & @nis) = 0)

begin

select convert(char(1),@sa),

convert(char(1),@ua),

convert(char(1),@id),

convert(char(1),@nis),

convert(char(1), ~(@sa & @ua) & @nis & 0x1),

convert(char(1), (@SA & @UA) & ~(@id ^ @nis) & 0x1),

convert(char(1),~(@sa & @ua) & @nis & 0x1 (@SA & @UA & ~(@id ^ @nis)) & 0x1)

 

select @nis = ~@nis & 0x1

if (@nis = 0) select @id = ~@id & 0x1

if (@nis = 0 and @id = 0) select @ua = ~@ua & 0x1

if (@nis = 0 and @id = 0 and @ua = 0) select @sa = ~@sa & 0x1

 

end

select convert(char(1),@sa),

convert(char(1),@ua),

convert(char(1),@id),

convert(char(1),@nis),

convert(char(1), ~(@sa & @ua) & @nis & 0x1),

convert(char(1), (@SA & @UA) & ~(@id ^ @nis) & 0x1),

convert(char(1),~(@sa & @ua) & @nis & 0x1 (@SA & @UA & ~(@id ^ @nis)) & 0x1)

Länk till kommentar
Dela på andra webbplatser

Bo Anders Svensson

Tydligen ramlade or-operatorn bort någonstans så här följer en errata;

 

X Y skall vara X ! Y

(X) (Y) skall vara (x) ! (Y)

 

convert(char(1),~(@sa & @ua) & @nis & 0x1 (@SA & @UA & ~(@id ^ @nis)) & 0x1)

 

skall vara

 

convert(char(1),~(@sa & @ua) & @nis & 0x1 ! (@SA & @UA & ~(@id ^ @nis)) & 0x1)

 

Där ! skall bytas mot pipe-tecknet.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...