Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Bitvis åtgärd för logiskt resultat: ! har högre prioritet än |. Använd || eller (!( x | y)) i stället
Anmärkningar
Operatorn ! ger ett booleskt resultat och operatorn | (bitwise-or) tar två aritmetiska argument. Operatorn ! har också högre prioritet än |.
Därför har ett av följande fel identifierats:
Uttrycket är felaktigt parentesiserat:
Eftersom resultatet av
!är booleskt (noll eller ett) kommer ett försök att testa att två variabler har bituppsättningar bara att testa att den lägsta biten finns på höger sida:((!x) | y) != (!(x | y))närx == 0ochy == 1.Operatorn
!är felaktig och bör vara en~i stället:Operatorn
!har ett booleskt resultat, men operatorn~har ett aritmetiskt resultat. Dessa operatorer är aldrig utbytbara, även när de körs på ett booleskt värde (noll eller ett):((!x) | y) != ((~x) | y)närx == 1ochy == 0.Binäroperatorn
|är felaktig och bör i stället vara||:Även om
|det ibland kan utbytas med||är det inte likvärdigt eftersom det tvingar fram utvärdering av höger sida av uttrycket. Vissa biverkningar i den här typen av uttryck kan vara terminal:(!p | (*p == '\0')), närp == NULL, måste vi avrefereras för att utvärdera den andra halvan av uttrycket.
Den här varningen rapporteras inte om operatorn ! är på höger sida av operatorn | eftersom det här fallet vanligtvis bara är det relativt ofarliga fallet med en felaktig operator.
Det är svårt att bedöma problemets allvarlighetsgrad utan att undersöka koden. Koden bör kontrolleras för att säkerställa att det avsedda testet sker.
Den här varningen indikerar alltid eventuell förvirring i användningen av en operator eller operatorprioriteten.
Namn på kodanalys: LOGICALNOTBITWISEOR
Example
Följande kod genererar den här varningen:
void f(int x, int y )
{
if (!x | y)
{
//code
}
}
Du korrigerar den här varningen genom att använda något av exemplen som visas i följande kod:
void fC(int x, int y )
{
/* When checking whether any bits are set in either x or y. */
if (!(x | y))
{
// code
}
/* When checking whether bits are set in either */
/* the complement of x or in y. */
if ((~x) | y)
{
// code
}
}
#include <windows.h>
void f(int x, BOOL y )
{
/* When y is a Boolean or Boolean result. */
if ((!x) || y)
{
// code
}
}