프로그래밍 언어/C언어

C언어 & && , | ||차이점

원원 2020. 7. 12. 23:01

안녕하세요 C언어 & vs && , | vs ||차이점에 대해 알아보겠습니다



&와 |는 비트연산자라고 부르고 &&와 ||는 논리연산자라고 부릅니다



비트연산자 or -> |

0b1101 | 0b0010 = 0b1111



논리연산자 or -> ||

0b1101 || 0b0010 = 1



비트연산자 and -> &

0b1101 & 0b0010 = 0



논리연산자 and -> &&

0b1101 && 0b0010 = 1





비트연산자는 실제 비트를 비교해서 값을 나타내줍니다

논리연산자는 값을 비교해서 1 or 0으로 나옵니다

여기서 헷갈리는 부분이 있습니다



논리연산자 and -> &&

0b1101 && 0b0010 = 1


코드에서 0은 FLASE고 0이 아닌 값은 TRUE입니다

그래서 위에 논리연산자 &&일때 1이 나오는 것 입니다

예시)

if(100)

printf("참?");

결과값:참


위에 말한걸 코드로 적용해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h> 
 
int call(int* a)
{
    return ++*a;
}
int main(void
    int A = 0b1101;
    int B = 0b0010;
    
    printf("%d \n",A || B);
    printf("%d \n",A | B);
    
    printf("%d \n",A && B);
    printf("%d \n",A & B);
    
    return 0;
}
 
결과값

1

15

1

0






이 외에도 if문에서 조건을 비교 할 때도 사용합니다

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
int call(int* a)
{
    return ++*a;
}
int main(void
    int A=100;
    
    if(101 == call(&A) || 101 == call(&A))
        printf("참\n");
        
    printf("%d",A);
    
    return 0;
}
 
 

결과값

101




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
int call(int* a)
{
    return ++*a;
}
int main(void
    int A=100;
    
    if(101 == call(&A) | 101 == call(&A))
        printf("참\n");
        
    printf("%d",A);
    
    return 0;
}
 

결과값

102


논리연산자 ||는 왼쪽과 오른쪽에있는것중 왼쪽이 참이면 오른쪽꺼는 검사를 안합니다

비트연산자 |는  왼쪽과 오른쪽에있는게 참이든 아니든 상관없이 둘다 검사합니다

이런식으로 if문에있는 조건이 참,거짓 여부에 따라 결과가 다르게 나오게 됩니다


********오류인경우

    if( 102 == call(&A) || 101 == call(&A))

        printf("참\n");



첫번째조건 만족하지않음(101) -> 두번째조건 검사함 (102)

결과적으로 A의값은 102가 됨


    if( 101 == call(&A) || 102 == call(&A))

        printf("참\n");

첫번째조건 만족함

결과값 : 101


**********

    if( 101 == call(&A) | 102 == call(&A))

        printf("참\n");


    if( 101 == call(&A) | 102 == call(&A))

        printf("참\n");

이 경우는 둘다 검사해서 A의 값이 102가 됨

**********


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
int call(int* a)
{
    return ++*a;
}
int main(void
    int A=100;
    
    if( 1 == call(&A) && 2 == call(&A) )
        printf("참\n");
        
    printf("%d",A);
    
    return 0;
}
 

결과값

101


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
 
int call(int* a)
{
    return ++*a;
}
int main(void
    int A=100;
    
    if( 1 == call(&A) & 2 == call(&A) )
        printf("참\n");
        
    printf("%d",A);
    
    return 0;
}
 

결과값

102


논리연산자(&&)를  사용한 경우 첫번째(1 == call(&A) ) 조건만 검사했습니다

비트연산자(&)를 사용한 경우는 첫번째,두번째( 1 == call(&A) & 2 == call(&A) ) 다 검사했습니다



* 정리

1)

비트연산자 : | , &

논리연산자 : || , &&


2)

비트연산자 논리값  : 값 비교한 값

논리연산자 논리값 : 1 or 0


3)

*and 기준 

비트연산자 : if문에서 조건이 2가지가 있고, 첫번째 조건이 만족하지 않아도 두번째도 검사함

논리연산자 : if문에서 조건이 2가지가 있고, 첫번째 조건이 만족하지 않으면 조건검사 멈춰버림

이런경우라면 비트연산자를 사용하는게 좋아보임.