
Ako pochopiť tento programátorský zvrat?
active = !!(data & 0x04)
To, čo som nepochopil je to, prečo sú tam dva výkričníky. Vie to niekto znalý programovania objasniť?
Myslím si, že je to chyba a mal by tam byť len jeden výkričník ako negácia výsledku hodnoty v zátvorke.
Je moja úvaha správna?
Celá konštrukcia je takáto:
/* Read GPIO pin2 as Hardware controlled radio state */
RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
active = !!(data & 0x04);
if (!active)
{
RTMPSetLED(pAd, LED_RADIO_OFF);
*(UINT8 *)pData = 0;
}
else
*(UINT8 *)pData = 1;
V JavaScriptu jeden vykřičník provede negaci a zároveň konverzi na boolean. Druhý vykřičník to opět zneguje a už to zůstane boolean.
Je to v zásadě ekvivalentní k:
active = (data & 0x04) !== 0;
Vyzerá to tak, že druhá negácia je tam navyše.
Pôvodne to dáva:
[root@f24 sys]# rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: yes
Po úprave výrazu
active = !(data & 0x04); to dáva:
[root@f24 sys]# rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
wlan adaptér sa rozbehne, začne skenovať siete a je možné sa normálne prihlásiť.