null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
!! 이중 부정 연산자
#c
#operator
#boolean
#trick
#embedded
@devpc
|
2026-05-04 12:40:02
|
GET /api/v1/nodes/455?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
0
Calls
# !! 이중 부정 연산자 ## 무엇인가 ```c int x = 42; int y = !!x; /* y = 1 */ int z = 0; int w = !!z; /* w = 0 */ ``` `!!`는 어떤 값이든 0 또는 1로 정규화한다. --- ## 동작 원리 C에는 `bool` 타입이 없었다(C99 이전). 0이 거짓, 0이 아니면 참이다. ```c int val = 42; !val /* = 0 (42는 참이므로 !42 = 0) */ !!val /* = 1 (!0 = 1, 0이 아닌 값을 1로 정규화) */ ``` `!` 연산자는 항상 0 또는 1을 반환한다. 두 번 적용하면 원래 참/거짓은 유지하면서 값을 1로 정규화한다. --- ## 어디서 쓰는가 ### 비트 필드에 플래그 저장 ```c typedef struct { unsigned int enabled : 1; /* 1비트 */ } Config; int sensor_active = 42; Config cfg; cfg.enabled = !!sensor_active; /* 42를 1로 정규화 후 비트 필드에 저장 */ ``` 1비트 필드에 1 이상의 값을 대입하면 잘린다. `!!`로 정규화하면 안전하다. ### 배열 인덱스나 카운터에 활용 ```c /* 조건이 참이면 1, 거짓이면 0을 더하는 카운트 */ int count = 0; for (int i = 0; i < n; i++) { count += !!(arr[i] > threshold); } ``` ### 매크로에서 안전한 bool 변환 ```c #define TO_BOOL(x) (!!(x)) int flag = TO_BOOL(ptr); /* ptr이 NULL이면 0, 아니면 1 */ ``` --- ## `<stdbool.h>` 이후 C99부터 `<stdbool.h>`를 포함하면 `bool`, `true`, `false`를 쓸 수 있다. ```c #include <stdbool.h> bool flag = (x > 0); /* 자동으로 true/false 반환 */ ``` C99 이상 환경에서는 `!!` 대신 `bool` 타입을 쓰는 게 더 명확하다. 단, 레거시 C89 코드나 MISRA C 환경에서는 `!!`를 여전히 볼 수 있다. --- ## 정리 `!!x`는 x를 0/1로 정규화하는 관용구다. 임베디드·시스템 C 코드에서 자주 등장하므로 읽을 수 있어야 한다. 새 코드에서는 `bool`을 쓰는 것이 더 명확하다.
// COMMENTS
Newest First
ON THIS PAGE