3.5 논리 연산자    [doc]    [smts]

 논리 연산자는 다수의 조건식을 논리식으로 연결하는 연산자이이다. C 언어의 논리 연산자는 다음과 같은 것들이 있다.


[표 3.5.1] 논리 연산자.

논리연산자

의미

사용 예

&&

AND

i>80 && i<90

||

OR

i>10 || i<20

!

NOT

!(i<10)


논리 연산자에서 NOT의 의미인 ‘!’ 연산자는 관계 연산자의 ‘같지 않다’인 ‘!=’와 비슷하다. 그래서 초보자들은 가끔 혼동하는 경우가 있으니 주의해야 한다.


 예를 들어 정수형 변수 ‘ia가 0보다 크고 10보다 작다’ 라는 논리식은 다음과 같이 ‘0보다 크다’와 ‘10보다 작다’ 라는 논리식을 and로 묶어야 한다.


0 < ia  && ia < 10

세 개 이상의 조건문도 논리 연산자로 묶을 수 있다. ‘문자형 변수 ca가 ‘a’ 이거나 ‘b’ 혹은 ‘c’이다’라는 논리식을 다음과 같이 or로 묶어야 한다.


ca == ‘a’ || ca == ‘b’ || ca == ’c’

다음 논리식은 ! 연산자를 이용한 예이다.


!(ia>0) // ia<=0과 같다.
!(ca == ‘a’ || ca == ‘b’) // (ca != ‘a’ && ca != ‘b’) 과 같다.

 논리 연산자는 관계 연산자와 마찬가지로 내부적으로 참(true), 거짓(false)의 값을 가진다. &&는 양쪽 조건식이 모두 참일 때 전체 조건식이 참이 되며 ||는 양쪽 조건식 중 하나 이상이 참일 때 전체 조건식이 참이 된다. !은 참은 거짓으로, 거짓은 참으로 논리값을 바꿔준다.


 실습으로 어떤 short형 변수 값이 양의 짝수인지를 판별하고 어떤 실수형 변수가 1보다 크거나 –1보다 작은지를 검사하는 프로그램을 작성해보자.


ex03-07.c
#include <stdio.h>
int main(void) {
   short sA = 10;
   float fX = 2.0f;
   if ( sA>0 && sA%2 == 0 )
       printf("sA is a positive even number.\n");
   if ( fX<-1 || fX>1 )
       printf("|fA|<1.\n");
}

이것을 실행하면 첫 번째 printf()문만 수행될 것이다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 증감연산자(++, --)  (0) 2015.05.19
C/C++의 조건 연산자(?:)  (0) 2015.05.19
3.4 관계 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
Posted by 살레시오
,

3.4 관계 연산자    [DOC]    [SMTS]

관계 연산자는 두 개의 피연산자 간의 상등/대소 관계를 판단하는 이항 연산자이다. 보통 if 명령이나 조건 연산자 ?와 조합되어서 사용된다. 사용법을 정리하면 다음 표와 같다.


[표 3.4.1] 관계 연산자

관계 연산자

의미

x == y

x 값과 y 값이 같다.

x != y

x 값과 y 값이 서로 다르다.

x < y

x 값이 y 값보다 작다.

x <= y

x 값이 y 값보다 작거나 같다.

x > y

x 값이 y 값보다 크다.

x >= y

x 값이 y 값보다 크거나 같다.


관계 연산자에서 주의할 점은 ‘같다’를 표현하는 ‘==’이다. 흔히 하는 실수가 조건식에 ‘=’하나만 써 놓고 프로그램이 제대로 돌아가지 않는다고 의아해 하는 경우이다. C/C++언어에서는 ‘=’는 오른쪽의 데이터를 왼쪽에 대입하라는 의미이다. 이것과 구별시키기 위해서 ‘==’를 사용한다. 또 하나는 ‘같지 않다’란 관계 연산자인 ‘!=’이다. 만약 ‘!’하나만 쓴다면 논리연산자의 NOT 이므로 주의해야 한다. 그리고 ‘작거나 같다’의 ‘<='을 ’=<‘으로 바꿔 쓰지 않도록 주의하자. ’크거나 같다‘도 ’>=‘로 써야지 ’=>‘로 쓰지 않아야 한다.


int ia = 10, ib = 10, ic = 33
ia == ib //참(1)
ib == ic //거짓(0)
ib != ic // 참(1)
ic < ib // 거짓(0)

관계연산의 결과가 참일 때는 내부적으로 1값(true)을 가지고 거짓일 때는 0값(false)을 갖는다.  

그리고 관계 연산자의 두 피연산자의 데이터 형은 반드시 일치시켜야 한다. 만약 그렇지 않으면 엉뚱한 결과가 나올 수 있다. 다음 예를 살펴보기 전에 if 명령어의 문법을 간단하게 알아보자.


if (조건식) {
  명령들;
}

제어 명령어인 if 는 구조가 굉장히 간단한데 if 바로 다음에 오는 괄호 안 조건식이 참이면 중괄호 { }로 묶여진 명령들을 실행하고 거짓일 경우에는 실행하지 않는다.  조건식에서는 관계연산자와 다음 절의 논리연산자가 사용되며 조건식은 반드시 시작과 끝을 괄호로 묶어야 한다. if 명령은 또한 else 와 짝을 이루어 사용되기도 한다.


if (조건식) {
  명령들1;
} else {
   명령들2;
}

이렇게 하면 조건식이 참이면 {명령들1}이 실행되고 거짓이면 {명령들2}가 수행된다.


 다음 예제를 살펴 보자.


ex03-05.c
#include<stdio.h>
int main()
{
  char cA = 'A', cB = 'a';
  short sA = -10;
  unsigned long ulA = 1000;
  float fA = 1.0/10;

  if (cA == cB)
      printf("cA equals cB\n");
  if (sA < 0)
      printf("sA is negative.\n");
  if (ulA%2 == 0)
      printf("ulA is an even number.\n");
  if (fA != 0.1f)
      printf("fA is not 0.1f.\n");
      
  printf("%ld > %d : %d.\n",ulA, sA, ulA>sA);
}

sA is negative.
lA is an even number.
fA is not 0.1f.
1000 > -10 : 0.

위의 프로그램에서 실행된 결과를 하나씩 살펴보자. 먼저 첫 번째 if 문에서 (cA == cB)조건을 검사했다. 전절에서 설명한 대로 문자상수는 내부적으로 ASCII코드값으로 취급된다. ‘A’의 아스키코드는 65이고 ‘a’는 97이므로 cA는 65이고 cB는 97이다. 따라서 (cA == cB)조건은 거짓이 되므로 그 밑의 printf()함수가 수행되지 않는다. 그 밑의 printf()함수에서는 논리식 (sA < 0)이 참이므로 내부적으로 printf()문이 실행된다.


그 다음 조건식은 (fA != 0.1f)인데 fA는 1.0f/10으로 초기화 되었으므로 당연히 이 조건은 거짓으로 판명되고 그 밑의 printf()문은 수행되지 않아야 되지만 실행 결과를 보면 참으로 판단되었음을 알 수 있다. 이 예제에서 보듯이 C/C++ 에서는 실수형 변수에 대해서 직접 같다(==), 다르다(!=)를 사용하는 것은 정확하지 않은 결과를 초래할 수 있으므로 가급적 피해야 한다.


 그리고 마지막 문장에서 (ulA > sA)라는 조건도 ulA는 1000이고 sA는 –10이므로 당연히 참일 것 같지만 결과는 거짓(0)으로 출력되었다. 이렇게 비교연산의 두 피연산자의 데이터형이 다르면 결과가 엉뚱하게 나올 수 있으므로 주의해야 한다.


 이 예제에서 보듯이 실수형(float, double, long double)의 같고 다름을 판별할 때는 주의를 기울여야 한다. 보통 C/C++언어에서는 보통 두 실수가 서로 같은 값인가를 비교하지 않는다. 오류를 발생시킬 확률이 높기 때문이다. 이는 십진수를 2진소수로 변환하는데서 발생하는 오차때문이며 앞에서도 언급한 바와 같이 float형의 소수점 이하 유효 자리수는 정수부를 포함해서 6자리 정도에 불과하다는 사실에도 주의해야 한다.


이제 사용자로부터 입력받은 정수가 짝수라면 화면에 “even number.’ 라고 출력하고 홀수이면 “odd number”라고 출력하는 프로그램을 작성해 보자. 짝수는 2로 나누었을 때 나머지가 0인 정수이다.


ex03-06.c
#include<stdio.h>
int main()
{
  int ia;
  scanf("%d", &ia);
  if (ia%2 == 0) {        
      printf("even number.\n");
  } else {
      printf("odd number.\n");
  }
}

이 프로그램을 실행시키고 정수를 입력하면 그 정수가 짝수라면 화면에 “even number!”라고 출력이 되는 것을 확인할 수 있을 것이다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 조건 연산자(?:)  (0) 2015.05.19
C/C++의 논리 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
Posted by 살레시오
,

3.2 산술연산자와 부호연산자    [DOC]    [SMTS]

 산술 연산자는 덧셈, 뺄셈 등 산술 연산을 수행하는 연산자들이고 부호 연산자는 부호를 지정하는 것들이다. 산술 연산자는 피연산자가 두 개이므로 이항 연산자이고 부호 연산자는 피연산자가 하나이므로 단항 연산자에 해당된다.


 사칙 연산자 +, -, *, /, % 는 덧셈, 뺄셈, 곱셈, 나눗셈 그리고 나눗셈의 나머지를 구하는 연산을 수행하는 이항 연산자이다. 예를 들면 다음과 같다.


int ia = 11, ib = 22, ic, id, ie;
ic = 1a + ib;
id = ia – ib;
ie = ia * ib;
double da = 1.1, db=2.2;
da = ie*ie;
db = da/ia;

 부호 연산자는 어떤 값의 부호를 지정하거나 바꾸는데 쓰인다. 여기서 +, -기호는 부호 연산자로도 사용되며, 부호 연산자는 한 개의 피연산자를 요구하는 단항 연산자이다.  예를 들면 다음과 같다.


+1234   -1234   -temp   +a   -b

따라서 다음과 같은 표현식에서 첫 번째 ‘-’는 부호연산자이고 두번째 ‘-’는 산술연산자이다.


ia = -ib - ic;

연산의 결과를 변수에 저장할 때는 결과 값이 그 변수의 허용 범위에 들어가는지 여부를 잘 판단해야 한다.


int ia = 2000000;
int ib = ia*10;
char ca = 129; // 오류
unsigned short usa = 50000, usb;
usb = usa + 20000; // 오류 발생

 나머지(%)연산의 예를 들면 다음과 같다.


10%5 // 0
3%2 // 1
8%3 // 2
3%5 // 3

한 가지 주의할 점은 %연산자의 피연산자는 정수형만 가능하다는 점이다. 예를 들어서,


a = b % c

는 변수 a에 변수 b값을 c로 나눈 나머지를 대입하는 것인데 변수 b와 변수 c는 정수형(char, short, int, long, long long과 각각의 unsigned 형)이어야 한다는 것이다.


다음 예제는 사용자로부터 하나의 숫자를 입력받아서 2로 나눈 나머지를 출력해 주는 프로그램이다.


ex03-01.c
#include <stdio.h>
int main(int argc, char** argv)
{
  int ia;
  scanf("%d", &ia); //정수를 입력받는다.
  printf("result:%d", ia%2);
}

실행 결과

123
result:1

이 예제에서 scanf()함수는 전에 설명한 대로 사용자로부터 입력을 받는 기능을 한다.  첫 번째 인수로 “%d”로 지정하면 정수를, “%f”로 지정하면 실수를 입력받아서 그 뒤의 변수에 그 값을 저장한다. 변수명 앞에 변수의 주소를 구하는 ‘&’를 꼭 붙여야 되므로 유의하자.


다음 예제는 두 수를 입력받아서 덧셈, 뺄셈, 곱셈, 나눗셈의 결과를 표시해 주는 프로그램이다.


ex03-02.c
#include <stdio.h>
int main(int argc, char** argv)
{
  float fa, fb;
  scanf("%f %f",&fa ,&fb); //두 수를 입력받는다.
  printf("fa+fb=%f\n", fa+fb);
  printf("fa-fb=%f\n", fa-fb);
  printf("fa*fb=%f\n", fa*fb);
  printf("fa/fb=%f\n", fa/fb);
}

1e5
12.34
fa+fb=100012.340000
fa-fb=99987.660000
fa*fb=1234000.015259
fa/fb=8103.727615

키보드로 숫자들을 입력할 때 공백 문자(스페이스바 혹은 엔터키)로 두 수를 입력해야 함에 유의하자.


 변수를 사용할 때에는 항상 저장할 수 있는 범위를 고려하여야 한다. 또한 나눗셈의 경우 0으로 나누는 경우가 발생하지 않는지 검토해 보아야 한다. 다음 예제를 실행시켜 보자. (변수명을 타이핑 할 때 대소문자를 반드시 정확히 입력해야 한다.)


ex03-03.c
#include <stdio.h>
int main(void)
{
   char cA = 123, cB = 10, cC = -100, cR1, cR2;
   unsigned char ucW = 110, ucX = 100, ucY = 200;
   unsigned char ucR1, ucR2;
   short sA = 1234, sB = 100, sR1, sR2;
   cR1 = cA + cB + cC;
   cR2 = cA / cB;
   ucR1 = ucW - ucY;
   ucR2 = ucX * ucY;
   sR1 = sA/sB;
   sR2 = sA%sB;
   printf("cR1=%d, cR2=%d\n", cR1, cR2);
   printf("ucR1=%d, ucR2=%d\n", ucR1, ucR2);
   printf("sR1=%d, sR2=%d\n", sR1, sR2);
}

실행 결과

cR1=33, cR2=12
ucR1=166, ucR2=32
sR1=12, sR2=34

이 예제에서는 ucR1과 ucR2 변수의 결과값이 unsigned char형의 범위를 벗어나므로 엉뚱한 값이 표시됨을 눈여겨봐야 한다.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 논리 연산자  (0) 2015.05.19
3.4 관계 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
C/C++의 goto 명령  (0) 2015.05.19
Posted by 살레시오
,