논리연산을 할 시 이부분을 주의해야 한다.
#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 |