블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive


 증감연산자.

 a = a +1; , ++a;는 같은 뜻.


예) b=100; ,a=5;


b= ++a;(1)


b = a++;(2)


1. 전치문 a : 6,  b : 6


2. 후치문 b : 5,  a : 6


b = ++a; 알아보기 쉽게 표현.


a = a + 1;


b = a;


b = a++; 알아보기 쉽게 표현.


b = a;


a = a+1;





부가연산자.(대입연산자)

부가 연산

부가

x += 5;

x = x + 5;

-5;

x = x - 5;

x %= 5;

x  = x % 5;

*x;

x = x * 5;


가능하면 오른쪽으로 프로그래밍 한다!!

좌변 = 우변

좌변  = l(L) value

우변  =  r(R) value

'='이 기준이다.

변수선언시 유의

변수 = 변수, 상수, 수식, 함수

예) 3= 5;(x) 좌변이 상수(x)

3 + 1 = 5 + 4; 좌변이 수식(x)

 다음은 변수에 함수를 넣어 만든 소스.

#include <stdio.h>
int main()
{
  int inum;
  inum = printf("12\n");
  printf("%d\n", inum);
  return 0;
}

enter까지 포함하여 화면에 inum의 갯수 가 출력된다.

지금 inum = printf("12\n");선언 되었다. 프린트문에 12가 출력되겠지만

이것이 printf("12\n"); inum에 대입되었다. 그래서 아래에 프린트문에서 %d로 받아 출력이 된다

그런데 3이 출력이 되었다. 12인데 3으로 출력이 된것은 우리가 enter키를 포함해서 출력한 것이다. 즉, 12가 출력이 되고 키보드로 enter를 누른 것까지 합하여 3이 나온것이다.





#include <stdio.h>
int main()
{
  int num = 17;
  printf("num += 5: %d\n", num += 5);
  printf("num -= 5: %d\n", num -=5);
  printf("num *= 5: %d\n", num *=5);
  printf("num /= 5: %d\n", num /=5);
  printf("num %= 5: %d\n", num %=5);    
  
  return 0;
}

 x += 5; -> x= x+5;만 쓴다.(알아보기 쉽다)

int num;

num = num +5;(초기화되지 않았다)

num  =17; 선언하면-> 초기화된 상태. 

num + 5;에서 17을 + 5 연산을 먼저한 뒤, = 좌변에 있는 num에 저장된다.

그래서 아래 출력에 22가 나온다. 2번째 프린트문에서도 마찬가지로  num = num -5;

에서 num이 저장되어 있는 값 22를 먼저 -5한 다음 = 좌변에 있는 num에 대입이 된다.

그래서 17이 된다. 그와 같은 방법으로 연산이 되어 아래와 같은 결과가 나온다.

이부분은 잠깐 맨마지막 참고 자료에서 따로 언급하겠다.





캐스트 연산자.

int + float 인 경우 생각해보자. int가 정수형 float이 실수형. 서로가 다른 타입의 자료형

이 때 int가 실수형인 float으로 변환하여 연산된다. 이처럼 int의 타입이 실수형으로 임시적으로

변하게 이것을 캐스트라고 부른다.

캐스트  : 타입을 바꾸는 것, 상수, 변수 앞에()를 붙이면 수동적으로 자료형을 바꿀 수 있다.

예) 4+3.2f = 묵시적형변환(컴파일시 error를 띄우지 않는다)

(float)4 + 3.2f = 명시적형변환(수동적으로 캐스트를 집어넣었다.)

4를 (float)으로 지정하지 않아도 자동적으로 캐스팅 되지만(위의 예),

(float)으로 수동적으로 해주면 정확한 결과를 얻을 수 있다. 다음의 예제를 보면서 생각해보자.



#include <stdio.h>
int main()
{
  int intA= 14, intB =3;
  
  float floatC = 0;
  
  floatC = intA / intB; //
  printf("%f\n",floatC);
  
  floatC = (float) intA / intB;
  printf("%0.10f\n", floatC);
    
  
  return 0;
}

floatc = intA /intB;에서 자료형인 intA와 intB는 같은 정수형이다. 그래서 먼저 14/3을 연산하여 몫이 4가 나오는데 = 좌변인 float의 의해 실수형이된다. 그러나 이미,  intA /intB;가 대입하기 전에 먼저 int형으로 계산하여 float에 대입된다. 

즉, intA /intB; = 4.xxxxx에서 .xxxxxx가 지워지고 4만 남게 된다. 그리고 이제야 실수인 float에실수형의 변환하지만, 4.0000000으로 출력된다. 이미, .xxxxxxxx부분이 날아갔기 때문이다.

하지만, 다음구문floatc = (float)intA /intB; 에서는 수동적으로 캐스트를 해주었다. 즉 intA는 실수가 되는 것이고 따라서 intB또한 실수형으로 변환한다. intA/intB가 캐스트되어 실수형소수까지 연산되고, = 좌변읜 float에 대입된다. 이때, 똑같은 실수형이므로 출력이 4.xxxxxx까지 출력된다. 위의 프린트문에서는 소수점 10자리까지 표현되었다.

 그런데 결과값이 제대로 나오지 않았다  그이유는 float의 크기가 작아 다 표현하지 못해 에러가 났다

이런 경우 float 값을 double 로 바꾸면 정상적으로 출력된다.


printf()함수

형식

1.("내용");

2.(" %형\n", 변수,상수); 

3.("%형%형", , , ); 그림참조


 4.대소문자.

5.소수점사용가능 예)4.5;

다음예제보기. 30을 10진수, 8진수, 16진수




#include <stdio.h>
int main()
{
  int num;
  num = 30;
  printf("%d\n", num); //10진수
  printf("%o\n", num);//8진수 
  printf("%x\n", num);//16진수
  
  return 0;
}





scanf()함수

scanf() 수가 키보로부터 값을 받을 때는 사용 <엔터 >  

지는 입력  는다.

버퍼 - 그램과  이에 일시으로 값을 저장

단락문자(공백문자) - 여러개의 입력값은 동시에 읽을 경우 사용

                                , 문자, 탭문자


127을 소스에 입력한다고 생각하자. 
scanf내부처리를 표현하면 
num = ('1' - '0')*100; // 1*100이되어 100
num = ('2' - '0')*10 + num; //  (2-0)*10+ 100이되어 120.

num = ('7' - '0') + num; // 7+120이 되어 비로소 127이된다.





#include <stdio.h>
int main()
{
  printf("%d\n"'9'-'0');
  printf("%p\n"255);
  printf("%08x\n"255); // 8자리를 나타내되, 앞에 비워있는 곳은 0.
  
  return 0;

}




%p를 쓰면 000000FF로 출력된다.

%08x = 000000ff로 출력된다.이것을 보아 %08X를 하면 %p와 같은 값이 나온다고 알 수 있다.

08에 8은 여덟자리를 나타내고 앞에0은 숫자가 없는곳은 0으로 표현한다.





#include
 <stdio.h>
int main()
{
  int a =123;
  
  printf("*1234567890*\n");
  printf("*%5d*\n", a);
  printf("*%7d*\n", a);
  
  
  return 0;
}





%5d와 %7d.

%5d는 5자리까지 표현. -를 붙이면 *123__*로 된다.(__는 보여주기 위한 것.)

%7d는 7자리까지 표현 *____123*, %-7d는 *123____*이 나온다.



#include <stdio.h>
int main()
{
  int num;
  char ch;
  float fnum;
  
  printf("Please enter integer, character\n, floating poinber number : ");
  scanf("%d %c %f"&num, &ch, &fnum);
  printf("You typed na integer : %5d\n", num);
  printf("You typed na integer : %5c\n", ch);
  printf("You typed na integer : %9.2f\n", fnum);
  
  return 0;
}




제어문 - 실행순서를 정하는 문.

원래는 프로그램은 위에서 아래로 순차적으로 실행되어 최종값을 도출하나, 제어문에서는 그것을 반대로 하거나 중간에 있는 것을 뛰어넘고 실행할 수도 있다. 그래서 제어문이다.

복합문 : {}가 2세트 이상 들어가 있는 소스.(괄호의 줄을 맞춰서 작성한다. 그래야 분별이 쉽다.)

선택문 : if/if else/swich문 ....

반복문 : for/while/do -while.......


#include <stdio.h>
int main()
{
  if(1)
  printf("하이\n");
  if(0)
  printf("하이\n");  
  return 0;
}
if()의 가 참일 때 다음 프린트문이 실행되고 거짓일 때는 실행되지 않는다.
그래서 if(1) = 참이다. 괄호안에 1이면 참 0이면 거짓이다.
그래서 아래와 같이 if(1)아래 프린트문과 실행되고 if(0)은 실행되지 않는다.










복합문

#include <stdio.h>
int main()
{
  int a, b; //
  a = 15;
  {
    int a = 100// 새로 변수를 지정 100
    b=23;
    printf("a + b = %d and a - b =%d\n", a + b, a -b); //123, 77
  }
  printf("a + b = %d and a - b =%d\n", a + b, a -b);//중괄호를 벗어낫기 때문  
  return 0;
}
변수를 중복 지정 할 수 없지만, 복합문에 중괄호에는 지정이 가능.
그러나 중괄호안에서만 효과가 있다. a + b에서 새로선언한 100이 연산되어 값이 저장된다.
글래서 123. 77이 나온다.
그러나 }중괄호 닫히는 순간, 바낕쪽 소스에는 int a = 100; 선언은 효과가 없다. 그래서 제일 위에
선언한 int a; , a = 5;가 저장되어 출력값 38, -8이 나온다.



참고

미정값 = 값은 있지만,불명확한 값 (일명, 쓰레기값)

cpu와 메모리

int num = 100;

num = num - 5;

num = num + 5;

num = num + 1;.........

printf("...\n",?);

있다고 가정하자. 여기서 cpu를 다시보자.

cpu의 주요 3대기능이 arithmatic(산술), cu(제어), reg(저장)이 있다. 위에서 int num = 100;은 메모리의int의 넘이라는 미정값이 저장된다.  그리고 100이라는 숫자가 num에 저장되어 메모리의 초기화가 된다. 이때 cpu에도 저장을 하는 역할을 reg가 담당한다. 그리고 num이 -5를 연산하는데 이 때의 역할을 alu가 담당한다. 그리고 cpu가 메모리에 보내는것을 cu가 제어한다.

자 그럼 cpu와 메모리의 저장되는 형태, 순서를 정리해보자.

최초의 int num은 메모리에 기억(미정값)

그리고 = 100;에 의해 초기화.

cpu에도 초기환 된값을 저장되어있다(reg)

다음 -5;를 연산하는데 일단 cpu가 이 연산한 값95를 가지고 있다. 그러나 메모리에 보내지 않고 그대로 cpu에 남아서 연산처리 한다. 이 연산처리를 프린트문 바로 윗줄까지 cpu의 저장한 다음에 비로소 최종출력값만 메모리에 보내게 된다. 즉, 최종출력을 하기전에 cpu가 연산하여 저장하는 값을 캐시(chache)라고 한다. 

cpu가 캐쉬를 반복하여 한계에 다다른면, 제일 오래된 캐쉬값부터 지우고 새로운 값을 저장해 나간다. 위에 예에서는 가장 먼저 저장 되는 캐쉬는 95이다. num =num -5;에서 연산되 95이다. 지금 당장에는 문제가 되지 않는다. 그러나 나중에는 문제가 발생한다. 지금단계에서는 개념만 이해하자.




<!--[endif]-->

posted by 송시혁
2013. 3. 11. 13:25 카테고리 없음

 

1.doc

 

 

아스키 코드표.doc

 

 

 

 

 

 

posted by 송시혁

 

아스키코드 = (ASCII CODE)

American Standard Code for Information Interchange의 약자.

아스키코드 = 1바이트

다른 문자를 넣기 위해 확장 아스키코드 = 유니코드

0~7까지인 아스키코드에서 한 자리를 넘어선다.

그래서 한글을 비롯한 한문은 한글자당 2바이트.

영문 = 1바이트

한글 = 2바이트

아스키코드 참고.0~ 31은 제어 문자. 32~부터 출력.

32는 띄어쓰기(space bar)

아스키코드와 숫자

 

#include <stdio.h>
int main()
{
  char ch;
  
  printf("Please enter any character:");
  scanf("%c"&ch);
  printf("The ASCII code for characer %lc is %3d.\n", ch, ch);
  
  ch = '1' + '1';
  printf("The ASCII code for characer %lc is %3d.\n", ch, ch);
  
  return 0;
}

 

 

 아래 출력을 보면 49와 98이 나왔다. 이것을 비교해보자.

 

위의 printf 문에는 아무것도 하지 않고 변수만 지정한다. 이경우 화면상에 1을 치면 49가 나온다. 1의 아스키 코드번호가 %c에 의해 출력된다.

그러나 밑에 변수 ch = '1' + '1';은 98이다. '1'은 1의 아스키코드 값을 갖는다. 1의 아스키 코드값은 49이다. 그래서 변수에서 49 + 49가 되어 98이 출력이 된다.

1은 아스키코드도 되며, 숫자 1도 가능하다.

pdf표 참고.

 

escape sequence

 

 

#include <stdio.h>
int main()
{
  char ch;
  ch = 7;
  
  printf("%c", ch);
  return 0;
}

다음은 escape sequence를 활용한 프로그램이다. 위의 소스인 7번은 경보소리 

bell 이라는 것을 알 수 있다.                                   

escape sequence 표를 참고해서 실행해본다.

 

 

 아래 두 가지 소스를 짰다.

#include <stdio.h>
int main()
{
  char ch;
  ch = 92;
  
  printf("%c", ch);
  return 0;
}


변수에 번호를 넣는 방법

#include <stdio.h>
int main()
{
  char ch;
  ch = 7;
  
  printf("\\", ch);
  return 0;
}

프린트문에 직접 \\를 넣는 방법.

출력은 같다. 여기서 ch = 7; 은 신경안써도 된다. 7은 앞에 말했듯이 경보소리이나,

지금여기에서는 린트문에 %가 아닌 \\를 두개었다.

 

 

 

 

 

아래그림을 표와 비교해보자.

문문자열과
#include <stdio.h>
int main()
{
  printf("10진수 65: %c\n"65 ); // A 문자
  printf("16진수 40: \x40\n"); // @ 문자
  printf("8진수 73: \073\n"); // 세미 콜론
  printf("백슬래쉬 \\, 작은 따옴표 \', 큰 따옴표\"\n");
  printf("2 bell sound \a\a\n");
  
  
  return 0;
}

  

 

 

 

이 출력화면을 이해하려면 아스키코드를 보고 비교해봐야 한다. 일단, 

깊게 파고들지 말고 대충 이런형태로 출력이 되는 것을 이해하자.

 

문자열과 문자배열.

\0null이 뒤에 뭍으면 문자열이다. 다음은 "This is a string"이 메모리 형태로 저장된 그림이다.

\0이 실제로 있지만, 컴퓨터가 생략하여 실제 화면에서는 나타나지 않는다.

 어차피 \0은 없다, 공백문자이다.

'a'와  "a"의 메모리를 비교하면 'a' = a

"a" = a\0이 된다. -> \0이 생략되어 있다. 어쨌든 문자열이다.
  

문자배열의 선언 프로그램.

#include <stdio.h>
int main()
{
  char word[30]; /*문자배열의 선언 */
  
  printf("Please enter anything: ");
  scanf("%s", word);
  printf("%s, this is what you typed.\n", word);
  
  return 0;
  
  
  
}

word[30] = [30]은 30개의 공간을 만들어낸다. 제일 word[0]이 처음이고 

맨 마지막이 word[29]까지이다. 저기에서 a b를 입력하였다. 

a를 띄우고 b를 쓴다면, b는 출력되지 않는다. 즉, b는 저장되지 않느다.

메모리 주소로 표현하면, a\0이 저장된다. word[0]자리에 a가 들어가고 

word[1] \0에 들어간다.


\0은 공백이므로 a만 출력된다. 그리고 %s의 주목. string의 약자로 

%c가 한 문자만 받는데 비해 %s는 여러개의 문자를 받을 수 있다. 

그래서 문자열 형수정자라고 생각하면 된다.

scanf함수에서 문자열은 &를 쓰지 않는다.

 

문자배열의 다른 예제. 이 예제를 보고 다시 이해하자!

 

 

#include <stdio.h>
int main()
{
  char word[30]; /*문자배열의 선언 */
  
  printf("Please enter anything: ");
  scanf("%s", word);
  printf("%s, this is what you typed.\n", word);
  printf("%c\n", word[0]);
  printf("%c\n", word[1]);
  printf("%c\n", word[2]);
  printf("%c\n", word[3]);
  printf("%d\n", word[4]);
  return 0;
  
  
}

 

word[0] ,word[1],..... 각각의 자리에 t, s,....가 저장되어 

출력한다는 것을 알 수 있다.

word[4]자리에는 \0공백이 메모리에 저장되어 있으나, 화면에 출력되지 않는다.

글새서 %c로는 아무것도 나타나지 않는다. %d로 출력하여 0이 나타난다. 이것은

이자리에 공백문자 \0이 있다고 보여주기 위함이다.

연산자.

 

순서대로 우선순위이다.

가장 최고 높은 놈은 ()이다.

 

1(상수) +(연산자) num(변수); = 표현식.

단항연산자 : 1개의 항. 예) -1, a =1 단항이 아님.항이 2개.

산술연산자.

5/3 =1...... 2

%=2 나머지

/ = 1 몫

5칙연산자 중의 %와 /차이점 보기.

#include <stdio.h>
int main()
{  
  char cnum1;
  char cnum2;
  cnum1 = 100%3// '%'는 나머지
  cnum2 = 100/3// '/'는 몫
  printf("나머지와 몫은 : %d %d\n", cnum1, cnum2);
  printf("나머지는 : %d\n", cnum1);
  printf("몫은 : %d\n", cnum2);
  return 0;
}

 

위의 연산자의 숫자를 7 / 5로 바꾸어 보자. 그러면 소수는 계산이 안되고

정수만 출력될 것이다.

소수점을 출력하기 위해서는 변수 실수형인 float을 지정한다.

*두개의 연산자의 자료형인 다른 경우

char num;

int num1;

num + num1 이라면 num이 원래는char 선언되어 1바이트크기를 가지나 

num1이라는 int4바이트의 우선순위의 의해서

num도 정수형으로 된다.

int, float

inum + fnum

inum = 실수형으로 변한다.

연산의 우선순위를 잘 봐야한다.


 

비교연산자 




cnum 3<5 = 1. 

3이 5보다 작다는 것은 참이다. 참이면 1. 즉, 3<5는 이 자체가 1의 값을 가진다. 거짓이면 0이다.

cnum 3<=3;이면 3=3은 같기 때문에 참의 값이 된다.1

'='는 반드시 오른쪽에 위치한다.

c에서 =<쓰면 컴파일시 오류가 뜬다!!!

cnum ==3 해석하면 cnum와 3이 같으냐?라고 묻는것이다. 같으면 참이고 다르면 거짓.

5==3; 이라면 거짓이라 0의 값을 갖는다.

!= 같지않다. 5!=3은 같지 않기 때문에 참이 된다. 굉장히 특이한 놈ㅋ




논리 연산자



&& and &(주소), &(비트논리), &&(논리)

|| or

! not

char cnum;

cnum = 1&&1; 같으니 참

cnum -100&&30은 논리 연산자에서 0이 아니면 1로 간주한다. c문법에서는!!!

그래서 -100 = 1 30 = 1이므로 둘다 1로 간주하여 참이된다.

| = shift + \누르면 된다.

 

(x < 10)&&(y = 5); 해석하기 x=5라고 가정.

x < 10에서 5 < 10이기 때문에 참이 된다. 그래서 x < 10자체는 1이된다.

y =5 이므로 x의 값과 같다. 따라서 참이 된다. y = 100;이라고해도 (y =5)에서 5가 y에 대입되어 영향을 미치지 못한다.

 



 

#include <stdio.h>
int main()
{  
  int number;
  scanf("%d"&number);
  printf("Is number less than 10? %3d\n", number < 10);
  
  printf("Is number not equal to 10? %3d\n", number != 10);
  return 0;
}

위 프로그램을 보면,number < 10은  10보다 작으면 참이 됨고,

아래 프린트문 10이 아니면 참이 된다.

역시 scanf문에서 조건을 만족시키는  값을 지정해주면 참값이 출력된다.

논리연산자&&(and), ||(or), !(not)

#include <stdio.H>
int main()
{
  char cnum;
  cnum = -100 &&30;
  printf("%d\n", cnum);
  
  cnum = 0||0;
  printf("%d\n", cnum);

  cnum = !0;
  printf("%d\n", cnum);
}
  

 위에서 언급했듯이 첫번째 출력은 둘 다 1이므로 1이되고 두번째 출력은 0

은 0이으로 0이된다.

or는 하나만 1이라도 참의 값이 나온다. 세번째 출력은 0이를 부정하는

 부정논리이므로 0이 아닌 1이된다.

 

 

 

 

#include <stdio.h>

int main()
{
  char cNum;
  char cNum2;
  cNum = 100;
  cNum2 = ++cNum;
  
  ++cNum; //
  cNum++;
  cNum = cNum +1;
  printf("%d\n", cNum);  
  
  --cNum;
  cNum--;
  cNum = cNum -1;
  
  printf("%d\n%d\n", cNum, cNum2);
  

  cNum2 = cNum++;
  printf("%d\n%d\n", cNum, cNum2);
  return 0;
}

 위의 소스를 차례대로 해석해보자.

 

cNum 100이 저장되는 것은 알 수있고 ++cNum이 101이 되어 cNum2에 저장된다

그리고 다시 ++cNum에 저장되고 cNum = cNum +1;에

각각 1이 저장되어 104가 출력이 된다.

다시 -- 하여 되돌아온다는 것을 알 수 있다. cNum2 = cNum++;위까지

 cNum, cNum2가 각각 101의 값으로 저장되어있다.

변수 ++cNum, cNum++ 다음문법에서 차이를 보인다.

cNum2 = ++cNum;인 경우 ++cNum이 우선순위가 되어 ++cNum이

먼저 계산되고 cNum2에 대입된다. 그러나 cnum2= cnum ++;

이부분에서 우선순위가 갈린다. 

cnum2에 cnum의 값이 먼저 들어가서 101이 출력되고 다음에 cnum이 ++이되어

1이 더해져 102가 된다.

 이것이 뒤에 변수앞에 ++가 변수뒤 ++의 미묘한 차이이다.




#include <stdio.h>
int main()
{
  int cnum;
  int cnum2;
  cnum = 100;
  cnum2 = ++cnum;
  
  ++cnum;
  cnum++;
  cnum = cnum + 1;
  printf("%d %d\n", cnum, cnum2);
  
  --cnum; //103
  cnum--; //102
  cnum2 = cnum-1// cnum = 102, cnum2 = 101
  
  printf("%d %d\n", cnum, cnum2);
  return 0;
}

 


자 이번에는 좀 다른게 cnum2 = cnum -1;은 cnum2 = --cnum;와는 달리 cnum-1을

연산한 값이 나온다. 그래서 출력값이 다르게 나온다.


  

           


posted by 송시혁