5.1 산술 연산자
5.1.1 연산자의 종류
기능별 종류 |
연산자 |
산술 연산자 |
+,-,*,/,% |
부호연산자 |
+,- |
대입 연산자 |
= 복합 대입 연산자 |
관계 연산자 |
==, !=, <=, <, >=, > |
증감 연산자 |
++, -- |
포인터 연산자 |
*, &, [] |
구조체 연산자 |
. -> |
논리 연산자 |
||, &&, ! |
비트 연산자 |
|, &, ~, >>, << |
삼항 조건 연산자 |
?, : |
쉼표 연산자 |
, |
sizeof 연산자 |
sizeof |
캐스트 연산자 |
(type), type() |
괄호 연산자 |
() |
C++ 연산자 |
new, delete, ::, ., *, ->* |
-
단항 연산자
a++, a--와 같은 피연산자가 하나인 연산자
-
이항 연산자
a+b와 같은 피연산자가 두개인 연산자
5.1.2 산술 연산자
사칙 연산, 가장 많이 사용되는 연산자
- 예제 intdivide
#include <Turboc.h>
void main() { int score;
score=86+65+92+88; printf("총점=%d, 평균=%d\n", score, score/4); } |
|
- 예제 charani
#include <Turboc.h>
void main() { int i;
for(i=1; i<=75; i++) { gotoxy(i,10); if(i%2==0) { puts("_@"); } else { puts("^^@"); } delay(100); } } |
|
-
과제 ScrollChar
매 7칸마다 O를 출력하고 O의 사이에는 .을 출력해보자. 나머지 연산자를 사용하면 "매 7칸마다"라는 조건식을 작성할 수 있다 .또한 루프를 구성하여 O문자가 1초에 다섯번씩 오른쪽으로 움직이도록 하라. 반짝이며 이동하는 전구를 흉내낸다고 생각하면 된다.
#include <Turboc.h>
void main() { int i;
for(i=1; i<=75; i++) { gotoxy(i,10); if(i%7==0) { puts("O"); } else { puts("."); } delay(100); } } |
|
5.1.3 대입 연산자
변수에 어떤 값을집어 넣는 동작
변수의 값을 변경할 때 사용
사용 예
i=1;
i=2+3;
i=j+k*m;
-
좌변값
대입 연산자의 왼쪽에 올 수 있는 값
실제적인 메모리를 점유하고 있는 그 값을 바꿀 수 있는 대상
i=1; // i는 실제 메모리를 점유하고 있고 그 값을 마음대로 바꿀 수 있으므로 좌변
-
연산자의 리턴값
연산자는 연산 후 그 결과를 돌려주는데 이를 리턴값이라고 함
리턴값이란 원래 함수의 계산 결과를 의미하는데 연산자도 일종의 함수이므로 연산 결과를 리턴값이라 함
a=1+2; //덧셈의 결과인 3을 리턴하여 a에 대입
a=5;
b=5;
c=5;
위와 동일하게
a=b=c=5;
라고 정리하여 쓸 수 있음.
-
복합 대인 연산자
대입 연산자와 다른 연산자가 결합된 연산자
a=a+3;
a+=3;
두 문장은 같은 문장이다.
5.1.4 증감 연산자
a=a+1, a+=1, a++ // 세 식은 모두 동일
루프의 제어 변수를 증가 시킬 때 ++ 연산자를 많이 사용
-
전위형
증감연산자가 피연산자 앞에 위치한다. ++a, --a
-
후위형
증감연산자가 피연산자 뒤에 위치한다. a++, a--
전위형은 일단 값을 먼저 증감시킨 후 결과를 리턴
후위형은 값을 먼저 리턴하고 증감
- 예제 increase
#include <Turboc.h>
void main() { int i;
i=3; printf("전위형으로 썼을 때 : %d\n", ++i);
i=3; printf("후위형으로 썼을 때 : %d\n", i++); } |
|
전위형을 썼을 때 : 4
후위형을 썼을 때 : 3
-
예제 increase 해석
++i;
printf("전위형을 썼을 때 : %d"\n", i);
printf("후위형을 썼을 때 : %d"\n", i);
i++;
5.1.5 복잡한 수식
주로 복잡한 수식 내에서 증감 연산자를 사용 할 때 문제가 발생
- 예제 inconeline
#include <Turboc.h>
void main() { int i=3;
printf("%d, %d\n", i, ++i); } |
|
-
예제 inconeline 해석
4,4가 출력
C의 함수의 인수를 뒤에서부터 순서대로 전달하기 때문
3,4를 출력하려면 아래와 같이 구현
printf("%d", i);
i++; // 또는 ++i;
printf("%d", i);
-
과제 Over100
1부터 계속 증가되는 정수의 합을 누적시키다가 최초로 1000을 넘는 수를 구해 출력하라. 즉 1부터 어디까지 누적해야 1000이 넘는지를 구하는 문제이다.
#include <Turboc.h>
void main() { int i; int sum=0;
for(i=1; i<1000; i++) { sum=sum+i; if(sum>1000) { break; } } printf("%d까지의 합=%d\n", i,sum); } |
|
5.2 논리 연산자
5.2.1 관계 연산자
연산자 |
조건 |
== != > < >= <= |
좌변과 우변이 같다. 좌변과 우변이 다르다. 좌변이 우변보다 크다. 좌변이 우변보다 작다. 좌변이 우변보다 크거나 같다. 좌변이 우변보다 작거나 같다. |
좌변과 우변의 데이터 타입이 일채해야 한다
if(a!=0) 명령; == if(a) 명령;
위 두 문장은 동일하다.
5.2.2 논리 연산자
연산자 |
뜻 |
설명 |
! |
논리 부정(Not) |
논리식의 진위를 반대로 만든다. |
&& |
논리곱(And) |
두 논리식이 모두 참이어야 참이다. |
|| |
논리합(or) |
두 논리식 중 하나만 참이면 참이다. |
좌변 논리식 |
우변 논리식 |
&& 연산자 |
||연산자 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
&& 연산자 : 양쪽이 모두 참일 때만 참
|| 연산자 : 둘 중 하나만 참이면 참
5.2.3 비트 연산자
스타일값 중 원하는 값을 추출하거나 액세스 권한 같은 플래그를 다룰 때 비트연산자가 사용된다.
연산자 |
설명 |
~ |
비트를 반전시킨다. |
& |
대응되는 비트가 모두 1일 때 1이다. |
| |
대응되는 비트가 모두 0일 때 0이다. |
^ |
두 개의 비트가 달라야 1이다. |
<< |
지정한 수만큼 왼쪽으로 비트들을 이동시킨다. |
>> |
지정한 수만큼 오른쪽으로 비트들을 이동시킨다. |
b1 |
b2 |
b1 & b2 |
b1 | b2 |
b1 ^ b2 |
~b1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
xor연산(^)은 이미지의 이동이나 반복적인 점멸 처리에 사용
5.2.4 쉬프트 연산자
비트들을 지정한 수만큼 좌우로 이동시킨다.
비어있는 비트는 0으로 채워짐
5.2.5 쉬프트 연산과 곱셈
쉬프트 연산은 곱셈과 나눗셈의 대용으로 사용할 수 있다.
- 예제 shiftmulti
#include <Turboc.h>
void main() { int i;
printf("정수를 입력하세요 : "); scanf("%d", &i); printf("결과=%d\n", i<<1); //왼쪽으로 한자리 쉬프트 } |
|
정수를 왼쪽으로 한칸 쉬프트 하면 두배가 됨.
정수를 오른쪽으로 한칸 쉬프트 하면 절반이 됨.
10진수에서 쉬프트 연산은 10증 증감
2진수에서 쉬프트 연산은 2배 증감
중요한 루프에서 곱셈을 하느냐 쉬프트 연산을 하느냐에 따라 프로그램의 성능에 확연한 차이가 난다. (쉬프트 연산이 빠름)
5.2.6 회전 연산
원형 이동
밀려나는 비트는 버려지지 않고 반대쪽으로 다시 이동된다는 것이 특징
XOR연산과 회전연산은 암호화에 자주 사용된다.
- 예제 Dec2Hex
#include <Turboc.h>
void main() { int input; int low,hi;
for(;;) { printf("0~255사이의 수를 입력하시오(끝낼 때 -1) : "); scanf("%d", &input); if(input== -1) { break; }
hi=input>>4; low=input & 0xf; printf("입력한 수의 16진 표기 = %c%c\n", hi+'0'+(hi>9)*7, low+'0'+(low>9)*7); } } |
|
5.3 기타 연산자
5.3.1 삼항 조건 연산자
변수나 상수, 함수 호출문 등 논리값을 리턴하는 모든 식에 올 수 있다.
-
사용 예
(조건식) ? 값1:값2
- 예제 samhang
#include <Turboc.h>
void main() { int i=3, j=4, k=0;
k=(i>j) ?i:j; printf("큰 수=%d\n", k); } |
|
5.3.2 쉼표 연산자
두 연산식을 하나로 묶는 역할
- 예제 comma
#include <Turboc.h>
void main() { int i,j;
i=3; j=i+2; printf("i=%d, j=%d\n",i,j); } |
|
-
예제 twocontrol
5.3.3 sizeof 연산자
피연산자로 주어진 타입 또는 변수의 크기를 계산
-
사용 예
sizeof(타입 또는 변수)
- 예제 sizeof
#include <Turboc.h>
void main() { int i;
printf("int=%d\n", sizeof(int)); printf("double=%d\n", sizeof(double)); printf("i=%d\n", sizeof(i)); printf("string=%d\n",sizeof("string")); } |
|
-
배열의 요소 개수 알아보는 코드
sizeof(array) / sizeof(array[0])
5.3.4 캐스트 연산자
수식 내에서 변수의 타입을 강제로 다른 타입으로 바꿈
-
사용 예
(타입)변수 // c언어의 캐스트 연산자 형식
타입(변수) // c++언어에서 새로 추가된 캐스트 연산자 형식
- 예제 cast
#include <Turboc.h>
void main() { int i,j; double r;
printf("두 개의 정수를 입력하십시오(a b) : "); scanf("%d %d", &i, &j); r=i/j; printf("%d와 %d의 비율은 %f입니다.\n",i,j,r); } |
|
5.4 연산 규칙
5.4.1 연산 순위
순위 |
연산자 |
결합순서 |
1 |
() [] -> . |
왼쪽 우선 |
2 |
! ~ ++ -- + -(부호) *(포인터) & sizeof 캐스트 |
오른쪽 우선 |
3 |
*(곱셈) / % |
왼쪽 우선 |
4 |
+ -(덧셈, 뺄셈) |
왼쪽 우선 |
5 |
<< >> |
왼쪽 우선 |
6 |
< <= > >= |
왼쪽 우선 |
7 |
== != |
왼쪽 우선 |
8 |
& |
왼쪽우선 |
9 |
^ |
왼쪽 우선 |
10 |
| |
왼쪽 우선 |
11 |
&& |
왼쪽 우선 |
12 |
|| |
왼쪽 우선 |
13 |
? : |
오른쪽 우선 |
14 |
= 복합대입 |
오른쪽 우선 |
15 |
, |
왼쪽 우선 |
순위가 빠른 연산자가 가장 먼저 실행
5.4.2 결합 순서
결합 순서는 같은 연산자(또는 같은 순위 내의 다른 연산자)의 실행 순서를 지정한다.
5.4.3 산술 변환
데이터 타입이 조금 다른 변수끼리라도 자동으로 변환이 가능하면 연산을 허용한다.
- 예제 typeconvert
#include <Turboc.h>
void main() { int i,j; double d;
i=3; d=2.17; j=i+d; printf("j=%d\n",j); } |
|
- 이항 연산시 양변의 타입이 다르면 큰 쪽으로 상승 변환
- 대입 연산시 좌변의 타입을 따른다.
- 함수 호출시 실인수와 형식인수의 타입이 다르면 형식인수의 타입을 따라간다.
- 캐스트 연산자를 사용하면 강제로 타입을 변환할 수 있다. 사용자가 직접 지정한 명시적 변환
- 수식 내에서 사용될 경우 char, unsigned char, enum형은 int형으로 자동 확장되며 float형은 double형으로 확장
5.4.4 구구단 예제
- 예제 gugu2
#include <Turboc.h>
void main() { int i,j;
for(i=2;i<=5;i++){ for(j=1;j<=9;j++) { gotoxy(i*15-25,j+2); printf("%d * %d = %d", i,j,i*j); } }
for(i=6;i<=9;i++) { for(j=1;j<=9;j++) { gotoxy((i-4)*15-25,j+12); printf("%d * %d = %d", i,j,i*j); } } } |
|
- 예제 gugu3
#include <Turboc.h>
void main() { int i,j;
for(i=2;i<=9;i++){ for(j=1;j<=9;j++) { if (i<=5) { gotoxy(i*15-25,j+2); } else { gotoxy((i-4)*15-25,j+12); } printf("%d * %d = %d", i,j,i*j); } } } |
|
- 예제 gugu4
#include <Turboc.h>
void main() { int i,j;
for(i=2;i<=9;i++){ for(j=1;j<=9;j++) { gotoxy((i-(i>5 ? 4:0))*15-25,j+2+(i>5 ? 10:0)); printf("%d * %d = %d", i,j,i*j); } } } |
|
- 예제 gugu5
#include <Turboc.h>
void main() { int i,j;
for(i=2;i<=9;i++){ for(j=1;j<=9;j++) { //gotoxy((i-(i>5 ? 4:0))*15-25,j+2+(i>5 ? 10:0)); gotoxy((i-(i>5)*4)*15-25,j+2+(i>5)*10); printf("%d * %d = %d", i,j,i*j); } } } |
|
- 과제 AsciiTable
#include <Turboc.h>
void main() { int ch; int x,y;
gotoxy(34,1); puts("ASCII Table"); for(x=5,y=3,ch=' '; ch<=126; ch++,y++) { gotoxy(x,y); printf("%3d %x %c",ch,ch,ch); if(y==21) { y=2; x+=15; } } getch(); } |
|
'책정리 > 혼자 연구하는 C,C++ 1' 카테고리의 다른 글
7장 기억 부류 (0) | 2015.02.19 |
---|---|
6장 함수 (0) | 2015.02.19 |
4장 제어문 (0) | 2015.02.18 |
3장 변수 (0) | 2015.02.18 |
2장 첫 번째 예제 (0) | 2015.02.18 |