c언어 연산자 질문합니다.

vkvkvkvvv의 이미지

#include

int main(void)
{
int a,b,c;
printf("숫자입력");
scanf("%d", &a);
printf("숫자입력");
scanf("%d", &b);
system("cls");
c= (a>b)?b:a;
printf("input x:%d \n",a);
printf("input y:%d \n",b);
printf("smaller Number :%d \n",c);

a==b&&pirntf("같음");
}

위 상황에서 마지막 줄이 이해가 잘 안갑니다. a와 b가 같은 땐 pirntf가 실행되지만 다를 땐 실행이 되지 않는 현상이 나타납니다. &&연산자는 a==b의 결과와 printf의 문자열 길이를 반환한 결과를 &&로 비교해 줘야 하기 때문에 printf함수가 무조꾼 실행돼야 한다고 생각이 되는데 생각과 다른 결과가 출력되내요. 설명좀 부탁드리겠습니다.ㅠ

rgbi3307의 이미지

&&(AND) 논리연산자는 앞부분의 논리가 False이면 뒤부분은 확인하지 않아도 False가 되기 때문에,
뒤에 있는 printf()는 수행이 않되는듯 하네요.

반면에 ||(OR) 논리연산자는 앞뒤 논리를 모두 검증해야하기 때문에
a==b || printf("같음"); 하면 printf는 무조건 실행될듯 합니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

cinsk의 이미지

expr1 && expr2  // expr1이 참이면 expr2 평가, expr1이 거짓이면 expr2 평가안함 
 
expr1 || expr2     // expr1이 참이면 expr2 평가안함, expr1이 거짓이면 expr2 평가.

expr2의 side-effect만이 중요하다면, 다음과 같이 쓸 수 있습니다:

if (expr1)
  expr2
 
if (!expr1)
  expr2

ᅟbash, lisp, scala 등 functional programming에서는 종종 보이는 표현이긴 하지만, C/C++ 등에서는 자주 보지는 못했네요. 궂이 저렇게 쓰지 말고 if를 쓰는게 더 편할 겁니다. (매크로 정의할 때는 예외)