안녕하세요 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문에서 조건을 비교 할 때도 사용합니다
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가지가 있고, 첫번째 조건이 만족하지 않으면 조건검사 멈춰버림
이런경우라면 비트연산자를 사용하는게 좋아보임.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
C언어 가변인자란? (0) | 2020.08.05 |
---|---|
C언어 a,'a',"a' 차이점(변수,문자,문자열) (0) | 2020.07.26 |
call by value vs call by reference (0) | 2020.07.07 |
C언어 2차원 배열이란 (0) | 2020.07.06 |
C언어 포인터에 관해서 (0) | 2020.06.13 |