290 likes | 498 Views
LEC06. 연산자 기본. 오 정 열 jyoh@mail.chonbuk.ac.kr http://ofdm.xdns.co.kr Office : 공대7호관 511호 방문시간 : 오후2시~3시 M.P : 018-618-6618. 연산자와 피연산자. 연산자 연산자( operator) 는 산술연산자 +, -, * 기호와 같이, 이미 정의된 연산을 수행하는 기호나 키워드를 의미 피연산자 연산( operation) 에 참여하는 변수나 값을 피연산자( operand) 연산자의 기능별 분류 기능이나 특징으로 분류.
E N D
LEC06. 연산자 기본 오 정 열 jyoh@mail.chonbuk.ac.kr http://ofdm.xdns.co.kr Office : 공대7호관 511호 방문시간 : 오후2시~3시 M.P : 018-618-6618
연산자와 피연산자 • 연산자 • 연산자(operator)는 산술연산자 +, -, * 기호와 같이, 이미 정의된 연산을 수행하는 기호나 키워드를 의미 • 피연산자 • 연산(operation)에 참여하는 변수나 값을 피연산자(operand) • 연산자의 기능별 분류 • 기능이나 특징으로 분류 피연산자 피연산자 연산자
항 수에 따른 구분 • 연산에 참여하는 피연산자의 수에 따라 • 단(일)항, 이항, 삼항 연산자로 구분 • 단항 연산자 • 연산에 참여하는 피연산자가 하나인 경우는 일항 연산자 • 이항 연산자 • 연산에 참여하는 피연산자가 두 개인 경우는 이항 연산자 • 삼항 연산자 • 연산에 참여하는 피연산자의 수가 세 개인 것은 조건 연산자 하나뿐 산술연산의 + 기호는 기호 양쪽의 값을 더하는 연산을 의미하므로 이항 연산자이다. 부호를 의미하는 연산자인 - 기호는 기호 오른쪽 값의 부호를 의미하는 단항 연산자이다. 조건 연산자는 연산자 기호 가 ? : 이며 세 부분에 피연산자가 위치하는 삼항 연산자이다.
수식 • 연산식 • 컴퓨터는 수식(expression)을 이용하여 여러 가지 연산 처리 • 프로그램 언어에서 수식은 연산자(operator)와 피연산자(operand)의 조합으로 구성 • 피연산자는 변수나 상수, 또는 다른 수식으로 표현 • 수식은 항상 그 평가에 의한 결과 값을 갖음 • 수식의 평가 • 연산식의 평가(evaluation)는 그 연산식의 계산 • ‘7 + 5’를 평가하면 ‘12’, 이 때 평가된 ‘12’를 ‘식의 평가값’ • 연산자는 우선순위(operator priority)를 갖는데, 산술연산자에서의 우선순위는 ( ) 를 먼저하고 ( )를 나중에 계산
대입 연산자 • = • 변수의 저장 값을 대입하는 = 기호가 대입(할당) 연산자(assignment operator) • 대입 연산자는 연산자의 가장 기본이 되는 연산자이며, 그 기능을 가장 늦게 수행 • 다음과 같은 연산식에서는 3 + 4 * 5를 수행한 결과 값을 변수 a에 대입하는 기능을 가장 늦게 수행 • =의 결과 값 • 대입 연산자도 연산자이므로 연산을 수행한 후의 결과값이 존재 • 위에서 대입 연산의 결과 값은 왼쪽 변수에 저장된 값인 23 • 대입 연산자의 왼쪽 부분에는 반드시 변수만이 가능 • 그러므로 다음과 같은 연산식은 잘못된 것
문장 문법에 맞는 수식에 세미콜론 ;을 마지막에 놓으면 문장(statement)이 됨 즉 3+2;도 하나의 문장 그러나 이러한 문장은 프로그램에는 아무 영향을 미칠 수 없음 대입문 대입 연산자가 있는 연산식에 세미콜론 ;을 붙이면, 대입문(assign statement) 이러한 대입문은 변수의 값을 변화시키므로 매우 중요한 문장 문장과 대입문
예제 소스 • Assign.c • 다음 프로그램으로 연산식과 문장을 이해하고, 대입 연산자의 결과 값을 출력
산술연산자 • +, -, *, / • 산술 연산자는 더하기, 빼기, 곱하기, 나누기를 하는 사칙 연산자와 나머지를 구하는 연산자로 구성 • 나머지 연산자 % • 첫 번째 피연산자를 두 번째 피연산자로 나눌 때 그 나머지를 평가값으로 반환 • 예를 들어 7%5의 값은 2, 즉 7을 5로 나누면, 몫은 1이고, 나머지는 2 • 또한 나누기 연산자에서 7/5의 결과는 1 • 정수 7과 정수 5로 나누기를 연산하면 결과는 소수 부분은 나올 수 없으므로 평가값은 1
실습 예제 • Calcarithmetic.c • 사용자 입력 정수를 표준입력으로 각각 변수 x와 y 두 개의 변수에 저장 • 위 변수의 값을 이용하여 더하기, 빼기, 곱하기, 나누기와 나머지를 적당한 연산자를 이용하여 출력
실습 예제 • Calcsquarearea.c • 사용자 입력 정수를 표준입력으로 입력 받아 변수 width에 저장 • 이 변수의 값을 이용하여 정사각형의 넓이를 구하여 결과를 다음과 같이 적절히 출력
연산자 기호 의미 보다 크다 보다 작다 같다 같지 않다 크거나 같다 작거나 같다 op1 > op2 op1 < op2 op1 == op2 op1 != op2 op1 >= op2 op1 <= op2 피연산자 op1이 피연산자 op2보다 크면 참 피연산자 op1이 피연산자 op2보다 작으면 참 피연산자 op1이 피연산자 op2와 같으면 참 피연산자 op1이 피연산자 op2와 다르면 참 피연산자 op1이 피연산자 op2보다 크거나 같으면 참 피연산자 op1이 피연산자 op2보다 작거나 같으면 참 관계연산자 • 관계 연산자는 2개의 피연산자 크기를 ( )하기 위한 연산자 • 예를 들어 “x가 10보다 더 큰가?” 또는 “y가 0과 같은가?”와 같이 두 항의 값을 비교하는데 사용 • 두 개의 문자로 구성되는 관계연산자 기호 사이에는 공백문자가 없이 연결되어야 함 • 관계 연산자 “!=”, “>=”, “<=”는 연산 기호의 순서가 명확해야 함 • 관계 연산자 ==과 할당 연산자 =를 혼동하지 않도록 주의 • 문자 순서가 바뀐 =>은 연산자로 사용할 수 없다.
관계 연산 평가 • 관계 연산 평가 값 • 관계 연산자가 포함된 수식의 결과는 1(참을 의미)이 아니면 0(거짓을 의미) • 아래 표는 간단한 관계연산의 평가 결과
예제 소스 • Isplusdigit.c • 사용자 입력 정수를 표준입력으로 하나의 변수 x에 저장 • 이 변수의 값을 이용하여 관계식 (x > 0)을 출력 • 관계식 (x > 0)이 참이면 1을 거짓이면 0을 출력한다는 것을 확인
증감 연산 • 증감 연산자 기호 ++, --를 이용 • 피연산자는 연산자의 앞이나 뒤에 위치 • 증가 연산자는 ++a, a++와 같이 사용 • 이 연산자는 다른 연산자와 같이 연산의 결과(평가) 값을 갖음 • 연산에 참여하는 피연산자의 값 자체가 1 증가하거나 1 감소 • 증감연산자는 연산자의 위치에 따라 ++a, a++, --a, a-- 형태로 쓰이며, 피연산자를 1만큼 줄이거나 늘리는 데에 사용 • 즉 연산 a+1은 a 값에는 변화를 주지 않으나, a++는 변수 a의 값을 하나 증가시키는 효과 • 수식a++와 ++a는 평가 값이 서로 다름
연산자 위치가 중요 • a++, ++a • 증가 연산자가 변수 앞에 위치(++a)하면 수식의 평가값은 1 증가한 값 • 변수 뒤에 위치(a++)하면 수식의 평가값은 1이 증가하기 이전의 원래 값 • 그러나 변수 자체는 두 연산 모두 1 증가 • 결국 증가연산자 ++a와 a++는 모두 a=a+1의 효과 • a--, --a • 감소 연산자가 변수 앞에 위치(--a)하면 수식의 평가값은 1 감소한 값이나, 변수 뒤에 위치(a--)하면 수식의 평가값은 1이 감소하기 이전 원래의 값 • 변수 자체는 두 연산 모두 1 감소한다. • 감소연산자 --a와 a--는 모두 a=a-1의 효과 • 연산자 위치 • 모두 연산의 평가 결과는 연산자의 위치에 따라 다르다는 것에 주의 • 증감연산자의 위치가 피연산자보다 앞에 위치하는 형태의 표현 ++a, --a을 ( ) (prefix) • 마찬가지로 증감연산자의 위치가 피연산자보다 뒤에 위치하는 형태의 표현 a++, a--을 ( )(postfix)
증가 연산과 산술 연산 • 증가연산자 ++와 일반 산술 연산자와의 차이를 이해 • 일반 연산 • 증가 연산
증감 연산자 • 정리 • 예 • 예제 1 • 예제 2
장점과 주의점 • 증감연산 사용 이유 • 증감연산자를 이용하면 프로그램 형태가 간결 • 기계어 코드와 일대일 대응되므로 실행속도가 개선 • 주의점 • 연산자의 위치에 따라 평가 값 다르므로 주의 요구 • 증감연산자는 ++, --자체가 연산자 기호이므로 중간에 공백이 들어가면 안되고, • 산술연산이나 관계, 논리연산보다 그 평가를 먼저 한다. • 증감연산자는 피연산자로 변수를 사용할 수 있지만, 상수나 일반 수식을 피연산자로 사용 불가능 • 다음과 같은 수식은 잘못된 수식 int a = 10; ++300; /* 상수에는 증가 연산자를 사용할 수 없다 */ (a+1)--; /* 일반 수식에는 증가 연산자를 사용할 수 없다 */
예제 소스 • Basicincrement.c • 증감연산자의 예제를 작성하여 결과를 비교 • 증감연산자의 평가 값과 변수의 값을 증감시키는 효과를 이해
예제 소스 • Increment.c • 증감연산자가 다른 산술연산자와 함께 이용되는 예를 살펴보자.
논리 연산자 • &&(and), ||(or), !(not) • 논리 연산자는 두 개 또는 하나의 논리값을 0이나 1의 논리값으로 평가하기 위한 연산자 • C 언어에서는 논리 값이라는 유형은 없고, 다만 0은 거짓을 의미하며, 0이 아닌 것은 참을 의미하는 것으로 논리값을 대신 • 연산자 &&는 수학에서의 and를 의미 • 연산자 ||은 or를 의미 • 연산자 &, |가 and와 or로 사용하나 정확히 말하자면 연산자 &와 |는 비트 연산자
논리 연산자 • 논리 연산자의 연산 방법 • 연산에 참여하는 자료 값은 0은 거짓을 의미하며, 1(0이 아닌 값)은 참 • 정수 만을 이용하는 것은 아니고 실수나 다른 유형의 자료 값도 이용이 가능 • 다만 평가의 결과는 반드시 0이거나 1
논리 연산 예 • 5 > 2 && 3 == 2
논리 연산자는 수식에 포함된 그들의 피연산자의 0이 아닌 값(참을 의미)과 0인 값(거짓)에 따라 1이나 0으로 평가 결과가 도출 논리 연산 이용
예제 소스 • Logic.c • 위에서 살펴 본 논리연산자의 예제를 프로그래밍하여 결과를 비교 • 논리연산자의 평가 값은 0과 1, 두 값 중의 하나
단축 연산 • 논리 연산 &&, || • 논리 연산자로는 연산자 &&와 ||의 사용을 권장하며, 이러한 논리 연산자는 단축 연산(short circuit)을 수행 • 비트 연산자 &와 |는 논리연산자로도 이용 가능 • Short circuit logic • 논리 연산자 &&와 ||는 피연산자 두 개 중에서, 앞에 나오는 피연산자 만으로 결과가 결정되면 뒤에 나오는 피연산자는 평가하지 않고 결과를 반환 • 이러한 방법으로 연산의 효율을 높일 수 있기 때문 • (x && y) 수식에서 x의 값이 거짓이라면, 굳이 y의 값을 평가하지 않더라도 수식 (x && y)는 거짓 • (x || y) 수식에서 x의 값이 참이라면, 굳이 y의 값을 평가하지 않더라도 수식 (x || y)는 참
&&의 평가 • 효율적 평가 • 변수 a, b, c가 각각 10, 20, 3인 경우 • 다음 논리 연산식을 포함한 대입문이 실행된 후의 변수 값은 각각 무엇으로 변했을까? c = (a++ == 11) && (b++ == 20); • 여기서 주의할 점은 만일 (a++ == 11)이 0이면 더 이상 (b++ == 20)을 평가 하지 않는다는 것이다. • 또한 만일 (b++ == 20)을 평가하지 않으면 변수 b는 1이 증가하지 않을 것이다. • 위 문장이 실행된 이후에 다음 문장을 실행하면, 변수 a, b, c는 어떠한 값이 저장 되었을까? c = (a++ == 11) && (b++ == 20);
예제 소스 • Shortcircuit.c • 단축 연산이 프로그램에 미치는 영향
프로그램 연습 • 프로그램 목적 • 1피트(feet)는30.48센티미터(cm)로 하고 • 1파운드(pound)는 0.453592kg으로 • 구현 • 표준입력으로 킬로그램(kg) 단위의 몸무게, 센티미터(cm) 단위의 키를 입력 • 입력 받은 자료를 각각 파운드(pound)와 피트(feet)로 변환하여 몸무게와 키를 출력