블로그 이미지
송시혁

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

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

 

아스키코드 = (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 송시혁