본문 바로가기

c언어

6. 기타 연산자

논리연산을 할 시 이부분을 주의해야 한다.

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <conio.h>

void main(void)
{
	int k, x = -1, y = -1, z = 1;
	k = ++x || ++y && ++z;
	printf("%d %d %d %d\n", k, x, y, z);

	x = -1, y = -1, z = 1;
	k = x++ || ++y && ++z;
	printf("%d %d %d %d\n", k, x, y, z);
}

결과:

0 0 0 1

1 0 -1 1

 

이유는 다음과 같다.

증감연산, 논리연산, 대입연산 순으로 이루어져야 한다.

그런데 컴파일러 최적화에 의해 논리합연산 시 한쪽의 피연산자가 0이 아닌값(참)이라면

다른쪽의 피연산자의 결과값과 상관 없이 이므로 해당 연산은 생략된다.

또한 논리곱연산 시 한쪽의 피연산자가 0(거짓)이라면 다른쪽의 피연산자의 결과값과 상관 없이 거짓이므로 해당 연산은 생략된다.

 

예제를 보자!

1번의 경우 ++x와 ++y && ++z의 논리합 연산을 하기 전에

++x의 전위증가연산의 결과가 0이다.

따라서 뒤쪽 ++y && ++z를 해봐야 한다.

++y는 0이므로 ++z와 논리곱연산은 해보나 마나 0(거짓)이다.

따라서 ++z 증감 연산은 수행되지 않으므로

결과는 k = 0, x = 0, y = 0, z = 1이다.

 

2번의 경우 x++ 후위증가연산 이므로 증가연산을 나중에 한다.

따라서 ++y && ++z연산을 해보나 마나 논리합 연산의 결과는 1(참)이다.

결과는 k = 1, x = 0, y = -1, z = 1 이다.

 

 

[연습문제]

 

1. 사용자로부터 입력받은 두 정수가 모두 10보다 크면 1을 출력하고 그렇지 않은 경우(둘 중 하나라도 10보다 작거나 같은 경우) 0을 출력하는 프로그램을 작성하세요.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <conio.h>

void main(void)
{
	int n1, n2;
	printf("Input Your Number(2): ");
	scanf("%d %d", &n1, &n2);
	printf("result: %d\n", n1 > 10 && n2 > 10);
	return;
}

[실행결과]

 

 

2. 다음 코드의 실행 결과와 원리에 대해 답하세요.

[실행결과]

결과: 1 0 0 2 1

w++는 0이므로 x++ && ++y를 해봐야 한다.

x++는 -1이고 y는 ++y는 0이므로 논리곱의 결과가 0이다.

++z도 해봐야 한다. ++z의 결과는 2이므로 

최종적으로 nResult = 1이다.

 

 

3. 사용자로부터 세 정수를 입력받고, 그 중에서 가장 큰 정수를 출력하는 프로그램을 작성하세요. 단, 반드시 삼항 연산자를 사용하세요.

[소스코드]

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <conio.h>

void main(void)
{
	int n1, n2, n3;
	printf("Input your number: ");
	scanf("%d %d %d", &n1, &n2, &n3);
	printf("Largest Number: %d", n1 > n2 ? (n1 > n3 ? n1 : n3) : (n2 > n3 ? n2 : n3));

	return;
}

[실행결과]

'c언어' 카테고리의 다른 글

8. 반복문  (0) 2023.06.07
7. 기초 제어문  (0) 2023.06.05
5. 기초 연산자  (0) 2023.05.27
4. 기본 입출력 함수  (3) 2023.05.27
[문법] getchar()/putchar()  (0) 2023.05.08