c언어 질문

c언어 질문

작성일 2024.02.13댓글 1건
    게시물 수정 , 삭제는 로그인 필요

c언어에서 if (a&&b)처럼 if문 조건문 ()안에 &&논리곱 연산자가 들어갈 경우 a&&b중 a가 0이면 무조건 0이 되어 거짓이기 때문에 b를 수행하지 않는다고 합니다.
그런데 a&b인 비트 연산자가 들어가는 경우에는 a가 0일 경우에도 b를 수행하는 이유가 뭔가요??? a가 0인이상 똑같이 b의 값과 상관없이 0이 되어 거짓인게 아닌가요?


#c언어 질문 #c언어 질문 사이트 #c언어 면접 질문

profile_image 익명 작성일 -

일반적인 경우 그게 더 합리적이라 그렇습니다.

일단 "a가 0이다" 이걸 확인하는 것도 하나의 연산이고 그만큼 속도를 늦추는 행위라는 것을 아셔야 합니다. a가 0인 걸 감지하고 별도로 처리해주려면 (기계어 단위로 보았을 때) jeq 명령이 한 줄 추가되어야 하는데, 브렌치문이라서 성능에 은근 악영향을 끼칠 수 있습니다. 반면 a와 b간의 bitwise-and를 바로 계산하는 경우 그런 부담이 없습니다. 이건 보통 한 사이클에 연산이 처리됩니다. (물론 대신 무조건 b를 구하는 작업을 수행해야겠지요).

그래서.. 결국 "a가 0인 걸 미리 감지할 가치가 있는가 아닌가" 이게 문제가 되는데요. bitwise-AND의 경우 보통 그럴 가치가 없습니다. bitwise-and의 주된 용도는 bit masking같은 것이고 원래 이렇게 if문에 넣어 참/거짓 구분용으로 쓰라고 있는 게 아니기 때문에.. 대부분의 경우 a가 0이 아니고, a와 b를 구하는 데 복잡한 연산이 들어가지 않는 경우가 많아 굳이 이걸 비용을 들여가며 따로 감지할 필요가 없습니다.

반면 a&&b같은 경우 원래부터 참과 거짓을 가리라고 나온 용도상 a가 0일 가능성이 상대적으로 더 높고, if문의 일부로 쓰인 경우 어차피 브렌치가 들어가게 되니까 jeq를 if문의 일부로써 자연스럽게 녹여내는 게 가능할 수도 있습니다 (= 위에 언급한 연산 오버헤드를 녹여버릴 수 있음). 그래서 미리 감지하는 게 상대적으로 더 말이 되는 것이고요.

물론 그 외에도.. 컴파일러 설계나 언어 규격쪽 영향 같은 것도 있을 수 있겠습니다. (C언어 규격에서 저 부분이 어떻게 명시되어 있었는지 기억이 잘 안 나네요.. 표준은 본 지 하도 오래되어서..) 제가 적은 것은 성능적인 관점에서 왜 저게 합당한지입니다.

c언어 질문

... printf("8진수==>%o\n", data); } 각 정수형을 출력하는건데 오류가 나요 c언어 왕초보라 기본적인 것도 모르니 자세히 알려주시면 감사하겠습니다.....

c언어 질문있습니다.

c언어 질문있습니다. 1. 정수형 long long과 부동소수점형 long double 둘다 64비트인데 왜 부동소수점형이 훨씬 큰 범위의 숫자를 표현할 수 있는 건가요 2. 9.625를...

c언어 질문

c언어에서 if (a&&b)처럼 if문 조건문 ()안에 &&논리곱 연산자가 들어갈 경우 a&&b중 a가... (C언어 규격에서 저 부분이 어떻게 명시되어 있었는지 기억이 잘 안 나네요.. 표준은...

c언어 질문

A,S,M,D,Q 외에 다른 글자를 입력하면 지원되지 않는 연산자라고 떠야되는데 안뜨네요 어떻게 수정해야 되나요? 바로 채택 해드립니다...

c언어 질문

c언어에서 'a' 또는 's' 또는 'd' 또는 'f' 가 입력되기 전까지 100에서 1초에 1씩 빼고 싶은데 어떻게 해요 (내공 30) <> <> <> " " " " " " < kbhit()로 키보드가 눌러졌는지...

c언어 질문

c언어에서 헤더 파일을 만들때 왜 .h 라는 헤더 파일에 함수를 정의만 하고 다시 헤더파일의 소스파일(.c)에 함수를 만드나요??.. 그냥 헤더파일(.h)이나 헤더파일의 소스파일...

c언어 질문

c언어 배운 지 얼마 안된 초보입니다... "%c"와 " %c"의 차이가 궁금해서 질문합니당.... 공백을 쓰고 안 쓰고 차이가 무엇인지 알려주세요.... scanf 의 서식 문자열에 공백...

C언어 질문 /몫 나누기 연산자

... 파이썬에서 x=3/2, x=float(x) 하면 1.5라고 소수로 뜨고, 몫연산자는 1로 떳었는데, 왜 C언어에서는 /가 몫 연산자인가요? C언어에서는 나누어서 소수를 나타내는...

c언어 질문

c언어로 게임을 만들고 있습니다. #include <stdio.h> #include <Windows.h... 이후에도 오류가 생긴다면 코드를 첨부해서 질문주시면 그것또한...