-
반응형
C언에서 !을 사용하게 되면, 0이 아닌 숫자의 경우에 대해서 0으로 변경하고 0인 경우에는 1로 값을 변화시켜준다. !을 한번만 사용하게 되면 자연스럽게 0 or 1의 값을 갖게 되고 !!을 하게 되면 최초 0일 경우에는 0으로 그리고 0이 아닌 값인 경우에는 1로 값이 변환되게 된다.
즉, bool type처럼 0 or 1의 값으로 활용 가능하다.
int i = 12345; printf("%d\n", !i); printf("%d\n", !!i);
출력
0
1
위의 내용들이 사실 필요할까 싶지만 다음의 linux kernel에서의 일부 코드를 살펴보면,
static int ethtool_get_one_feature(struct net_device *dev, char __user *useraddr, u32 ethcmd) { netdev_features_t mask = ethtool_get_feature_mask(ethcmd); struct ethtool_value edata = { .cmd = ethcmd, .data = !!(dev->features & mask), }; if (copy_to_user(useraddr, &edata, sizeof(edata))) return -EFAULT; return 0; }
ethcmd을 넘겨주고 관련 설정이 on|off 되어 있는지를 확인할 수 있는 함수이다. 여러가지 설정값을 저장하고 있는 dev->features에 mask를 비트 연산한 결과 값에 대해서 !!을 하여서 0 or 1의 값을 저장한다. 넘어온 값도 의미있게 사용하고 그 값에 따른 설정 데이터가 있는지 on|off 를 !!를 사용해서 저장할 수 있다. C언에서만 볼 수 있는 테크닉이랄까.
반응형