모두의 코드 커뮤니티

(초보) for문 소스코드에 관한 질문입니다

안녕하세요. 이제 막 c언어를 배우기 시작해서 질문드립니다.

가 문제입니다.

제 소스코드는 아래와 같습니다. 절취선 아래 코드는 타 블로그의 코드입니다. 절취선 아래의 소스코드 if(!(j&1))이 의미하는 뜻이 무엇인지 궁금합니다.
#include<stdio.h>
int main(){
int i=0,j=0; //정수선언
scanf("%d",&j); //입력값

                    for(i=1; i<=j; i++){ //for 문

                            if(i%2==0)  //i가 짝수이면
                               printf("%d ",j); //출력

                    }
        return 0; 

}
=============================절취선====================================
int i=0,j=0;
scanf("%d",&i);
for(j=1; j<=i;j++){
if(!(j&1)) //궁금한 부분입니다.
printf("%d ",j); }

//if(!(j&1)의 뜻이 궁금합니다.여기서 not 연산자를 쓰는 이유를 모르겠습니다. !(j&1)이면 어떻게 해석해야할까요?
j가 1~10까지이니 2진수로 나타내어 1은 0001 2는 0010 3은0011~~~ 10은 1010
따라서
1은 0001이니 두 비트 연산 and를 통해 1은 0001&0001 = 0001
2는 0010 과 0001을 비트연산 0000
3은 0011 과 0001을 비트연산 0001
4는 0100 과 0001을 비트연산 0000
10이면 똑같이 진행했을 다 했다고 가정을하고 .
false이면 true, true이면 false를 반환하는 !연산자를 어떻게 적용해야하는건가요? (0000이면 0이니 true이니까 !연산자 적용해서 false인데 홀수가 아닌 짝수가 출력되는지. 혹시 제가 잘못알고있는건가요? 0이면 true 1이면 false )마지막으로 !(변수&1)이 짝수 공식이라면, 홀수 공식은 어떻게 만드나요? 계산이 안 되서요… 그리고 이와는 별개로 a!=0은 어떤 해석을 하면 될까요? 아래 문제에서 본 것입니다. i=0이면 false로 해석해야하는건가요? 도저히 모르겠어서요… 아래 문제를 타 블로그에서 풀었길래 여쭤봅니다.
문제: 0 이 입력될 때까지 정수를 계속 입력받아 3의 배수와 5의 배수를 제외한 수들의 개수를 출력하는 프로그램을 작성하시오. 입력값은 1~10까지입니다.
while(i!=0) // 어떠한 이유로 !i=0이라는 연산자가 0을 넣으면 멈추게하는지에 대해 궁금합니다
{ scanf("%d",&i);
if(i!=0)
{ if( i%3!=0 && i%5!=0) j++; } }
printf("%d",j);

너무 두서 없이 질문남겨 죄송하네요… 몇시간동안 제자리 걸음이라 답답하여 질문드립니다.

1 Like

! 연산자의 경우 논리 NOT 연산자라 불리며, 0 인 값에 ! 를 하면 참이 되고, 0 이 아닌 값에 ! 를 하면 거짓이 됩니다.

먼저 j & 1 의 경우 j 의 마지막 비트가 0 이면 0 이고, 1 이면 1 이죠.
따라서 (!(j & 1)) 의미는 j 의 마지막 비트가 0 이면 이고, 1 이면 거짓 을 의미하는 논리식이 됩니다.

이진수에서 마지막 비트가 0 이면 짝수이고, 1 이면 홀수죠. 결국 위 if 문은 j 가 짝수 이면 실행하는 문장이게 되겠습니다. 물론 그냥 j % 2 == 0 으로 해도 됩니다. 아무래도 비트 연산자가 나눗셈 연산보다 빨라서 그렇게 한 것 같은데, 요즘의 컴파일러들은 이정도는 알아서 최적화 해줍니다.

그리고 !=같지 않다면 이라는 의미 입니다. 즉 while(i != 0) 의 경우 i 가 0 이 아닐 동안 실행해라 라는 의미 입니다.

감사합니다!! 재범님 덕분에 궁금증이 해결됐습니다,.