-
[ !!의 쓰임 ] What is "!!" in C?C언어 2021. 1. 19. 18:18
!과 !!의 의미
A = 사과는 영어로 Apple이다. B = 신형 맥북프로의 공홈 가격은 10만원이다. A -> TRUE -> 1 B -> FALSE -> 0 !A -> !(TRUE) -> FALSE -> 0 !B -> !(FALSE) -> TRUE -> 1 !!A -> !(!(TRUE)) -> !(FALSE) -> TRUE -> 1 !!B -> !(!(FALSE)) -> !(TRUE) -> FALSE -> 0
쉽게 생각하면 3이나 4.5 같은 것을 1로 쉽게 바꿀 수 있는 표현이다.
반환값이 char* 이거나 0, 1이 아닌 int를 반환하는 경우 유용할 거 같다.
아래는 양수 혹은 0, 음수를 반환하는 함수를 이용해서
1이상의 수를 반환하는 경우에 I++을 해주려는 경우이다.i += (has_newline(target) > 0); //7이 반환되었다고 했을때, 7은 0보다 크니까 괄호가 TRUE가 되어, i에 +1이 된다.
이런식으로 짤 수도 있고
i += !!has_newline(target); //7이 반환되었다고 했을때, !7은 0이고 !0은 1이기 때문에 i에 1이 더해진다.
이런식으로 짤 수도 있다.
!을 사용한 코드
!을 사용하면 코드를 효율적으로 짤 수 있다.
fd = open("./test.txt", O_RDONLY); if (!fd) //open -> 정상으로 open했다면 파일 디스크립터의 양의 정수 값. 실패하면 -1 반환 return (-1); //실패시 -1 리턴하고 프로그램 종료.
아래는vi txt의 문장을 5글자씩 읽어오는 프로그램이다.
읽어온 5글자에 '\n'이 포함되어있으면 프로그램을 종료한다.
(한문장만 읽겠다는 뜻)#include <stdio.h> #include <unistd.h> #include <fcntl.h> int has_newline(const char *s) //buffer에 newline이 들어있는지 확인 하는 함수 { while (*s) { if (*s == '\n') return (1); s++; } return (0); } int main() { char *buf; int newline; int result; int fd; fd = open("./test.txt", O_RDONLY); if (!fd) return (-1); result = read(3, buf, 5); //while문에 들어가기 전에 한 번 읽는다. 여기서 결과가 0(문장의 끝)이나 -1(에러)로 나올경우에는 while문에 들어가지 않음 while (result > 0 && !newline) { printf("%s\n", buf); //출력 result = read(3, buf, 5); //5글자씩, 파일에서 읽어옴 newline = has_newline(buf); //newline이 있는지 체크 } if (result >= 0) printf("%s\n", buf); }
!!을 사용한 코드
위에서 봤던 코드에서, has_newline이라는 함수가
숫자가 아닌 char* 를 반환한다고 바꿔보자.[ Changed ]
-has_newline의 return 값 자료형(int -> char*)그런데 어떤 이유로 newline이 자료형을 int에서 char* 로 바꿀 수 없는 상황이다.
int 자료형인 newline에 has_newline의 반환값을 받으려면 어떻게 해야할까?[정답]
newline = !!has_newline(buf);
이렇게 해주면 (NULL)이 반환되면 숫자 0으로,
문자를 가리키고 있는 char * 가 반환되면 숫자 1로 바뀌어서 newline에 저장된다.* 오타를 찾아준 Taehokim과 Heom 감사합니다. ✉️
'C언어' 카테고리의 다른 글
C언어로 만든 테트리스 (0) 2021.05.15 [C언어] 포인터의 포인터, 그림으로 이해하기 (0) 2020.11.13 C awesome (0) 2020.11.03 size_t를 쓰는 이유 (0) 2020.10.09 [Makefile] ar & rcs (0) 2020.10.07