1.4.3 증감연산자 후치증가 a++: 프로그램의한명령줄이끝나고 1을증가시킨값을다시 a에저장. 후치감소 a--: 프로그램의한명령줄이끝나고 1을감소시킨값을다시 a에저장. 전치증가 ++a: 1을증가시킨값을미리 a에저장하고프로그램을수행. 전치감소 --a: 1을감소시킨값을미리 a에저장하고프로그램을수행. 예제 ) 증감연산 int a =11, b= 4; printf("a=%d\n", a); // a=11 printf("a=%d\n", ++a); // a=12 a에 1을더하여출력. printf("a=%d\n", a++); // a=12 a를출력한후 1을더함. printf("a=%d\n", a); // a=13 윗줄의수행후값. printf("a*a++=%d\n",a*a++); // a*a++=169 13*13 printf("a=%d\n\n",a); // a=14 윗줄의수행후값. printf("b=%d\n", b--); // b=4 b를출력한후 1을뺌, 출력후 b=3. printf("b=%d\n", --b); // b=2 윗줄에서 1을빼고출력. printf("b=%d\n", b); // b=2 현재의 b값. int a =11, b=4; cout<<"a="<<a<<'\n'; // a=11 cout<<"a="<<++a<<'\n'; // a=12 a에 1을더하여출력. cout<<"a="<<a++<<'\n'; // a=12 a를출력한후 1을더함. cout<<"a="<<a<<'\n'; // a=13 윗줄의수행후값. cout<<"a*a++="<<a*a++<<'\n'; // a*a++=169 13*13 cout<<"a="<<a<<"\n\n"; // a=14 윗줄의수행후값. cout<<"b="<<b--<<'\n'; // b=4 b를출력한후 1을뺌, 출력후 b=3. cout<<"b="<<--b<<'\n'; // b=2 윗줄에서 1을빼고출력. cout<<"b="<<b<<'\n'; // b=2 현재의 b값. 설명 : ++, -- 등은대표적인단항연산자 (unary arithmetic operator) 들로피연산자를하나 만사용하는산술연산자들이다. 이밖에도단항연산자로는부호변환연산자인 -가있다. 1.4.4 비교및논리연산자 두식간에관계를 true(1) 또는 false(0) 로나타낸다. 1) 비교연산자 (Relational Operator)
> greater than >= greater or equal == equal!= not equal < less than <= less or equal 예제 ) 비교연산 int a=11, b=4; printf("(%d>%d) =%d\n", a,b,a>b); // (11>4) =1 : true printf("(%d>=%d)=%d\n", a,b,a>=b); // (11>=4)=1 printf("(%d==%d)=%d\n", a,b,a==b); // (11==4)=0 : false printf("(%d!=%d)=%d\n", a,b,a!=b); // (11!=4)=1 printf("(%d<%d) =%d\n", a,b,a<b); // (11<4) =0 printf("(%d<=%d)=%d\n", a,b,a<=b); // (11<=4)=0 int a=11, b=4; cout<<a<<">"<<b<<" ="<<(a>b)<<'\n'; // (11>4)=1 : true cout<<a<<">="<<b<<"="<<(a>=b)<<'\n'; // (11>=4)=1 cout<<a<<"=="<<b<<"="<<(a==b)<<'\n'; // (11==4)=0 : false cout<<a<<"!="<<b<<"="<<(a!=b)<<'\n'; // (11!=4)=1 cout<<a<<"<"<<b<<" ="<<(a<b)<<'\n'; // (11<4)=0 cout<<a<<">="<<b<<"="<<(a<=b)<<'\n'; // (11<=4)=0 2) 논리연산자 (Logical Operator) AND(&&), T && T = T T && F = F F && T = F F && F = F OR( ) T T = T T F = T F T = T F F = F 예제 ) 논리연산 int a=11, b=4;
double d=2.5; printf("(a<=10)&&(b==5)=%d\n",(a<=10)&&(b==5)); // (a<=10)&&(b==5) =0 printf("(a<=10) (b==5)=%d\n",(a<=10) (b==5)); // (a<=10) (b==5) =0 printf(" (!a b)=%d\n",!a b); // (!a b) =1 printf(" (a b)=%d\n", a b); // (a b) =1 printf(" (!a!b)=%d\n",!a!b); // (!a!b) =0 printf(" (!!a!b)=%d\n",!!a!b); // (!!a!b) =1 printf(" (a&&b&&d)=%d\n", a&&b&&d); // (a&&b&&d) =1 int a=11; int b=4; double d=2.5; cout<<"(a<=10)&&(b==5)="<<((a<=10)&&(b==5))<<'\n'; // (a<=10)&&(b==5)=0 cout<<"(a<=10) (b==5)="<<((a<=10) (b==5))<<'\n'; // (a<=10) (b==5)=0 cout<<"(!a b)="<<(!a b)<<'\n'; // (!a b)=1 cout<<"(a b)="<<(a b)<<'\n'; // (a b)=1 cout<<"(!a!b)="<<(!a!b)<<'\n'; // (!a!b)=0 cout<<"(!!a!b)="<<(!!a!b)<<'\n'; // (!!a!b)=1 cout<<"(a&&b&&d)="<<(a&&b&&d)<<'\n'; // (a&&b&&d) =1 설명 : 논리연산시컴퓨터는 0을 false, 그외의수를 true로취급한다. a&&b&&d의경우, a, b, d가 0이아닌수이기때문에모두 true이다. 따라서연산결과는 true 즉 1 이다. 1.4.5 비트단위연산자 (Bitwise Operator) 1) 비트단위논리연산자 (Bitwise Logical Operator) bit AND: 1&1=1, 1&0=0, 0&1=0, 0&0=0 bit OR: 1 1=1, 1 0=1, 0 1=1, 0 0=0 bit XOR: 1^1=0, 1^0=1, 0^1=1, 0^0=0 bit Conversion: ~1=0, ~0=1 예제 1) bit 연산 short a=11, b=7; short w,x,y,z; /* bit 단위연산자는다음의법칙에의해계산된다. a=10 0000 0000 0000 1011
b=7 0000 0000 0000 0111 */ w=a&b; // bit AND 0000 0000 0000 0011 = 3 x=a b; // bit OR 0000 0000 0000 1111 =15 y=a^b; // bit XOR 0000 0000 0000 1100 =12 z=~a; //bit Conversion 1111 1111 1111 0101 =-12 printf(" a&b=%d\n",w); // a&b=3 printf(" a b=%d\n",x); // a b=15 printf(" a^b=%d\n",y); // a^b=12 printf(" ~a=%d\n",z); // ~a=-12 short a=11, b=7; short w,x,y,z; /* bit 단위연산자는다음의법칙에의해계산된다. a=10 0000 0000 0000 1011 b=7 0000 0000 0000 0111 */ w=a&b; // bit AND 0000 0000 0000 0011 = 3 x=a b; // bit OR 0000 0000 0000 1111 =15 y=a^b; // bit XOR 0000 0000 0000 1101 =12 z=~a; //bit Conversion 1111 1111 1111 0101 =-12 cout<<"a&b="<<w<<'\n'; // a&b=3 cout<<"a b="<<x<<'\n'; // a b=15 cout<<"a^b="<<y<<'\n'; // a^b=12 cout<<"~a="<<~a<<'\n'; //!a=-12 컴퓨터가음수를읽는방법 : 첫 bit이 1이면음수 bit Conversion(~): 어떤수 a가 (+) 일경우 bit conversion 하면그값은 -a-1 (-) 일경우 bit conversion하면그값은 -(a+1) 예제 ) -12를 short integer의 bit로표시하여라. +11을표시한후 bit 역전 (bit conversion) 을하면된다. 11 = 0000 0000 0000 1011-12 = 1111 1111 1111 0100 (-) 값이 (+) 값의보수 (complement) 즉 bit 역전을취하는이유에대해알아보자. a-b 의계산 : 컴퓨터는이것을 a+(-b) 로계산한다. 즉산술의빼기는존재하지않고 bit 의합만있을뿐이
다. 윗식에서 -7은 +6의 bit 역전으로표시된다, 6=0000 0000 0000 0110-7=1111 1111 1111 1001 a = 0000 0000 0000 1011 =11 -b = 1111 1111 1111 1001 =-7 bit 합 : a+(-b) = 0000 0000 0000 0100 = 4 예제 2) bit 연산 char x= 27; char y= 121; char z=x-y; printf("z=%d\n", z); // z=-94 char x= 27; char y= 121; char z=x-y; cout<<"z="<<(int)z<<'\n'; // -94 계산설명 : x = 27= 0001 1011 -y= -121 은 +120 = 0111 1000 의역전즉 -y=-121 = 1000 0111 x=27=0001 1011 -y=-121=1000 0111 z = x +(-y)=1010 0010 첫 bit가 1이므로이값은음수이다. 이것을역전하면 0101 1101 = 93 여기에 1을더하고 -를붙인값이계산결과이다. 예제 3) bit 연산 short a = 13; short b=-35; printf(" (a&b)=%d\n",(a&b)); printf(" ~(a&b)=%d\n",~(a&b)); // (a&b)=13 // ~(a&b)=-14
short a = 13; short b=-35; cout<<" (a&b)="<<(a&b)<<'\n'; // (a&b)=13 cout<<" ~(a&b)="<<~(a&b)<<'\n'; // ~(a&b)=-14 계산설명 : a= +13= 0000 0000 0000 1101 b=-35는 +34(0000 0000 0010 0010) 의역전 a= 0000 0000 0000 1101 b= 1111 1111 1101 1101 a&b= 0000 0000 0000 1101 =13 ~(a&b)= 1111 1111 1111 0011 =-14 2) 이동연산자 (Shift Operator) 주어진 bit 만큼좌우로이동시키는연산자 bit 이동연산 short a=13, b=-13; printf("a<<2=%d\n", a<<2); // a<<2=52 printf("a>>2=%d\n", a>>2); // a>>2=3 printf("b<<2=%d\n", b<<2); // b<<2=-52 printf("b>>2=%d\n", b>>2); // b>>2=-4 short a=13, b=-13; cout<<"a<<2="<<(a<<2)<<'\n'; cout<<"a>>2="<<(a>>2)<<'\n'; cout<<"b<<2="<<(b<<2)<<'\n'; cout<<"b>>2="<<(b>>2)<<'\n'; // a<<2=52 // a>>2=3 // b<<2=-52 // b>>2=-4 계산설명 :
a=13 0000 0000 0000 1101 a<<2 0000 0000 0011 0100 =52 // 좌로 2 bits 이동하면서뒤의빈자리를 0 으로채움. a>>2 0000 0000 0000 0011 =3 // 우로 2 bits 이동하면서앞의빈자리를 0 으로채움. b=-13 은 +12=0000 0000 1100 의역전즉 b=-13 1111 1111 0011 b<<2 1111 1100 1100 // 좌로 2 bits 이동하면서뒤의빈자리를 0으로채움 값 0000 0011 0011 에 1을더한값의 minus 값 = -52 b>>2 1111 1111 1100 // 우로 2 bits 이동하면서앞의빈자리를 1로채움 값 0000 0000 0011 에 1을더한값의 minus 값 = -4 1.4.6 기타연산자 1) 콤마연산자 (Comma Operator) 피연산자의나열에사용 예제 ) 콤마연산 void main () { int a, j; a=(j=15, j+4); // 좌에서우로평가하여최우측이결과값. printf("a=%d\n", a); // a=19 void main () { int a, j; a=(j=15, j+4); // 좌에서우로평가하여최우측이결과값. cout<<"a="<<a<<'\n'; // a=19 2) 조건연산자 (Conditional Operator) 조건이참이면물음표다음피연산자를수행하고아니면마지막피연산자수행. a<b? a : b 이것은 if(a<b) then a else b 의압축형 예제 ) 조건연산 int a=11;
int b=7; printf("%d\n", a<b? a:b); // 7 printf("%d\n", a>b? a:b); // 11 int a=11; int b=7; cout<<(a<b? a:b)<<'\n'; // 7 cout<<(a>b? a:b)<<'\n'; // 11 3) 캐스트연산자 (Cast Operator) 피연산자의형변환을위한연산자 예제 ) 형변환연산 void main () { int a=65, b=4; double c=3.123, d=9.987; char f='a'; printf("%d\n",(int)c+(int)d); // 12: double을 int로전환하여계산. printf("%.2lf\n",(double)a/(double)b); // 16.25: int를 double로전환. printf("%c\n",(char)a); // A: int를 char로전환. printf("%d\n",(int)f); // 97: char를 int로전환. void main () { int a=65, b=4; double c=3.123, d=9.987; char f='a'; cout<<(int)c+(int)d<<'\n'; // 12: double을 int로전환하여계산. cout<<(double)a/(double)b<<'\n'; // 16.25: int 를 double 로전환. cout<<(char)a<<'\n'; // A: int 를 char 로전환. cout<<(int)f<<'\n'; // 97: char 를 int 로전환. C++ 에서는 C 에서보다형변환이보다자유롭다. 즉 int(c)+int(d), double(a)/double(b),
char (a) 로도가능하다. void main () { int a=65, b=4; double c=3.123, d=9.987; cout<<int(c)+int(d)<<'\n'; // 12: double을 int로전환하여계산. cout<<double(a)/double(b)<<'\n'; // 16.25: int 를 double 로전환. cout<<char(a)<<'\n'; // A: int 를 char 로전환. 1.5 표준입출력함수 1.5.1 C 에서의표준입출력함수 1) 출력함수 printf(" 출력 format", 변수또는수식 ) putchar('char'): 한글자만을처리. 문자는 로표시 : A', '1', '*' puts("string"): 문자열은 로나타낸다. 2) 입력함수 scanf(" 입력형식, 입력변수주소 ) 입력변수는주소표기법으로입력되어야한다. 무차원배열의변수인경우변수앞에 &, 1 차원배열의경우변수이름그자체로표기된다. 공백문자가있는경우입력은그공백분자앞에서완료된다. getchar() 한글자를입력받음. gets( string ) 문자열입력. 예제 ) C의입출력함수 void main () { int a; char c; printf("a에정수를입력하세요 : a = "); scanf("%d", &a); printf("%d\n\n", a); putchar('m');
putchar('\n'); c=getchar(); putchar(c); putchar('\n'); 1.5.2 C++ 의입출력 1) 출력 stream cout<< 정수, 실수, 문자및문자열출력. 2) 입력 stream 및함수 cin>> C의 scanf() 와달리입력변수는주소표기법이필요하지않다. 공백문자가있는경우입력은그공백분자앞에서완료된다. getch() 한글자를입력받음. echo가없이문자입력. <conio.h> header file 필요. getche() 한글자를입력받음. echo를가지고문자입력. <conio.h> header file 필요. cin.get( 변수명, size) 또는 cin.get ( 변수명, size, 제어문자 ): 문자열입력 예제 1) 출력 stream: cout #include <string.h> // for strcpy() const int MAX=80; char s1[]="you mean everything to me."; char s2[max]; strcpy(s2, s1); cout<<s2<<'\n'; 예제 2) 입출력함수및 stream const int MAX=80; char str[max]; cout<<"enter a string\n"; cin.get(str, MAX); // 문자열입력함수
cout<<str<< \n'; 예제 3) 다중라인입력 const int MAX=80; char str[max]; cout<<"enter a string\n"; cin.get(str, MAX, '$'); // 문자열입력함수 cout<<str<<'\n'; cin.get() 은세개의인자를가질수있음, 마지막인자는입력의종료를알림. 1.6 오류 (error) warning: 실행코드는생성하나실행결과가옳치않을수있음. 종류 : 초기화가안되어있을경우, overflow 등등 error: 실행코드를생성할수없음구문오류 (Syntax error) 기계어가이해할수없는 source code. 링크오류 (Link error) 라이브러리함수또는모듈이빠진오류. 실행오류 (Run Time error) 논리오류로실행은되나결과가옳치않음. 예 ) 어떤수를 0으로나누는경우. 예제 ) 실행오류 short a=3400, b=2000, c; char ch=128; c=a*b; printf("c=%d\n",c); printf("ch=%c\n",ch); 설명 : 두수의곱 a*b를 short로정의된 c방에저장하려고할때그수가할당된 c의메모리사이즈보다크기때문에 overflow가발생한다. 또한 char ch가가질수있는최대값은 127 이므로이역시 overflow 되어알수없는문자를출력한다. 프로그램작성중가장많이범하는구문오류로는문장이끝나고세미콜론의생략, 콤마또는연산자의잘못사용, 또는함수가끝나고중괄호의누락등등이있으며이러한오류가있을때는프로그램자체가수행되
지않는다.