변수(Variable)
- literal을 기억시키기 위한 기억장소를 의미한다.
- 메모리상의 임의의 위치에 저장
- Datatype에 따라 일정 바이트 수 만큼 저장공간을 확보한다.
- Syntax
[기억류] 데이터타입 변수이름;
ex. [register] int kor; - 기억류를 생략하면 지역변수로 인식.
- 기억류나 데이타타입은 키워드이며, 변수이름은 식별자(identifier)이다.
1. 식별자의 규칙(Naming Convention)
1)변수명, 상수명, 함수명, 배열명, 구조체명, 공용체명, 라벨명에 사용
2)영문자와 숫자로 구성된다.
3)사용할 수 있는 특수문자는 유일하게 '_'만 가능하다.
4)반드시 첫글자는 영문자와 '_'만 가능
5)숫자는 두번째 글자부터 가능
6) 컴파일러에 따라 이름길이에 제한이 있을 수 있다.
ex. 표준 C : 8자 이내, C++ : 700자 이내, Trubo-C : 32자 이내, 지금은 제한 없음.
7)대소문자는 구별한다.
8)이름 중간에 공백이 올 수 없다.
9)되도록 의미있는 이름을 부여하자.
ex. aaa, bbb, ccc X / kor, eng, interest, hakjum O
2. 문자형 변수
- 문자형 리터럴 즉 한개의 문자(escape sequence 포함)를 저장하기 위한 공간
- 데이터타입 : char(-128~127), unsigned char(0~255)
- 메모리에 1Byte 공간 할당 받음.
- char --> sign bit 인정
- unsigned char --> sign bit 불안정 (양수만 저장)
- 출력서식
%c
char ch, ch1;
ch = 'x';
ch1 = 'M';
printf("ch = %c\n", ch);
printf("ch1 = %c\n", ch1);
ch = 66;
ch1 = ch + 5;
printf("ch = %c\n", ch);
printf("ch1 = %c\n", ch1);
ch = 'Z';
ch1 = 'z';
printf("ch = %d\n", ch);
printf("ch1 = %d\n", ch1);
출력 :
ch = x
ch1 = M
ch = B
ch1 = G
ch = 90
ch1 = 122
----------------------
unsigned char ch;
ch = 178;
unsigned char ch1;
ch = -1;
printf("ch = %c\n", ch);
printf("ch1 = %c\n", ch1);
출력 :
ch = ▒
ch1 = ▒
(쓰레기 값이 나오는 것을 볼 수 있다)
3. 정수형 변수
- 정수 리터럴을 저장하기 위한 변수
- 값을 이진화해서 저장하며, 음수는 1의 보수, 2의 보수로 변환 돼서 저장
- short(-32768 ~ 32767), unsigned(0 ~ 65535)
- int(4byte, -2147483648 ~ 2147483647), unsigned int (0~ 4294967295)
- long(int와 같음)
short kor, eng;
printf("kor's size = %d\n", sizeof(kor));
kor = 90;
eng = 100;
printf("kor = %d\n", kor);
printf("eng = %d\n", eng);
printf("kor + eng = %d\n", (kor + eng));
kor = 32769;
eng = 89.5;
printf("kor = %d\n", kor);
printf("eng = %d\n", eng);
출력:
kor's size = 2
kor = 90
eng = 100
kor + eng = 190
kor = -32767
eng = 89
(short가 표현할수 있는 범위는 -32768~32767이다. 그런데 이것은 원으로 이어져있다고 생각하면 되는데
32769를 집어넣었는데 표현할 수 있는 양수는 32767이라 두칸을 더갔다고 생각하면 된다. 그럼 32767 다음 -32768 다음 -32767이다.
그래서 -32767을 출력하는 것이다)
4. 실수형 변수
- 실수 리터럴을 저장하기 위한 기억장소
float f = 0.123456789123456789f;
double d = 0.123456789123456789;
printf("f = %.18f\n", f);
printf("d = %.18f\n", d);
출력 :
f = 0.123456791043281555
d = 0.123456789123456784
f는 소수점 7자리까지 정확.
d는 소수점 15자리까지 정확.
5. 문자열형 변수
- 한 글자 이상의 문자열을 저장하기 위한 기억장소
- "" 로 묶여진 리터럴 처리
- 출력서식 : %s
- 데이터 타입
1) char *
2) char []
char * irum = "경기도 수원시 정자동 123-567번지";
char name[] = "Michael Jackson";
printf("irum = %s\n", irum);
printf("name = %s\n", name);
출력 :
irum = 경기도 수원시 정자동 123-567번지
name = Michael Jackson
6. 나열형 변수 및 리터럴
1) 타 언어에서는 열겨형이라고 한다.
2) 위치에 따라 순서가 달라지고, 값이 달라진다.
3) 정수값을 대치하기도 한다.
4) 출력서식 : %d
5)나열형 변수 : 나열형 리터럴을 저장하기 위한 기억장소
enum yoil {SUN, MON, TUE, WED, THU, FRI, SAT};
printf("TUE = %d\n", TUE);
printf("SAT + WED = %d\n", (SAT + WED));
출력:
TUE = 2
SAT + WED = 9
(enum의 { }안의 차례대로 0,1,2 이렇게 숫자가 지정된다)
----------------------------
enum yoil {SUN, MON=10, TUE, WED=500, THU, FRI=1000, SAT};
printf("TUE = %d\n", TUE);
printf("SAT + WED = %d\n", (SAT + WED));
출력:
TUE = 11
SAT + WED = 1501
(MON이 10으로 지정되었으면 다음은 11이고, THU는 501, SAT는 1001이 된다)
---------------------------------
enum lessons {Ubuntu, Clanguage, Java, Oracle, Jsp, Spring};
enum lessons study;
study = Java;
printf("study = %d\n", study);
출력:
study = 2
형변환
암시적 형변환
//implicit conversion(cast)
//89.5 + 9;
(89.5는 실수이고 9는 정수인데 계산은 실수로 나오게 된다. 크기가 작은 쪽에서 큰 쪽으로 간다)
명시적 형변환
//explicit conversion(cast)
int kor = (int) 89.5;
(89.5를 정수만 표시하게 (int)를 통해 강제적으로 변환해준다)
double avg = 89.5;
int total = 300;
printf("avg + total = %f\n", (avg + total));
printf("total / 7 = %d\n", (total / 7));
printf("total / 7. = %f\n", (total /7.));
출력:
avg + total = 389.500000
total / 7 = 42
total / 7. = 42.857143
연산자(Operator)
- 연산하기 위한 기호
- 항(operand)을 연산하기 위한 기호
1. 연산자의 우선순위
1) 최우선 연산자 : [], (), ., ->
2) 단항 연산자 : (type), !, ~, +, -, ++, --, sizeof(), *, &
3) 이항 연산자 :
- 산술연산자 : +, -, *, /, %
- 이동연산자 : <<, >>
- 관계연산자 : <, >, <=, >=, ==, !=
- 비트 연산자 : ^, $, |
- 논리 연산자 : &&, ||
4) 삼항 연산자 : (조건) ? 참 : 거짓
5) 할당 및 복합 연산자 : =, +=, -=, /=, %=, <<=, >>=, |=, $=, ^=
6) 나열 연산자 : ,
2. 최우선 연산자(Primary Operator)
1) []
2) () : (4-5) * 6
3) . : 구조체형 변수가 구조체 속의 멤버에 접근할 때 사용하는 연산자
4) -> : 구조체형 포인터 변수가 구조체 속의 멤버에 접근할 때 사용하는 연산자
(1)
int array[3];
array[0] = 5;
array[1] = 7;
array[2] = 9;
printf("array[0] = %d\n", array[0]);
printf("array[2] = %d\n", array[2]);
출력 :
array[0] = 5
array[2] = 9
---------------------------------
(3)
struct Student{
int age;
double ki;
};
struct Student chulsu;
chulsu.age = 24;
chulsu.ki = 175.3;
struct Student younghee;
younghee.age = 18;
younghee.ki = 162.5;
printf("chulsu.age = %d\n", chulsu.age);
printf("chulsu.ki = %f\n", chulsu.ki);
printf("younghee.age = %d\n", younghee.age);
printf("younghee.ki = %f\n", younghee.ki);
출력 :
chulsu.age = 24
chulsu.ki = 175.300000
younghee.age = 18
younghee.ki = 162.500000
---------------------------------------------
(4)
struct Student {
int age;
double ki;
};
struct Student chulsu;
chulsu.age = 24;
chulsu.ki = 175.3;
struct Student * ptr;
ptr = &chulsu;
printf("chulsu.age = %d\n", ptr -> age);
printf("chulsu.ki = %f\n", ptr -> ki);
출력:
chulsu.age = 24
chulsu.ki = 175.300000
-------------------------------------------------
3. 단항연산자(Unary Operator)
1)(type) : 강제형변환(명시적형변환) 시 사용
2) ! :
- 논리 NOT
- false --> 0, true --> 0 외의 값
3) ~ : bit NOTk, 1의 보수 연산자
4) +, - : 양의 1을 곱하거나, 음의 1을 곱하는 연산자
int su = 5; -su --> -5 --> 5*-1
5) ++, -- : 각 항에 1을 누적하거나 감소하는 연산자
int su = 5;
su = su + 1; --> su++;
su = su - 1; --> su--;
6) & 연산자 : 해당 변수의 메모리 절대번지를 얻어오는 연산자
7) * 연산자 :
- pointer 변수를 선언할 때 사용
- 이미 선언된 pointer 변수에 *를 사용하면 그 포인터 변수가 가리키는 공간을 의미한다.
8)sizeof 연산자
- 메모리에 확보된 사이즈를 표시하는 연산자
(2)
int isTrue = 4 > 5;
printf(" isTrue = %d\n", isTrue);
printf("!isTure = %d\n", !isTrue);
출력:
isTrue = 0
!isTure = 1
-------------------------------------------
enum BOOLEAN {FALSE, TRUE};
int isTrue = FALSE;
printf(" isTrue = %d\n", isTrue);
printf("!isTure = %d\n", !isTrue);
return 0;
}
출력:
isTrue = 0
!isTure = 1
--------------------------
(3)
int su = 128;
printf("su = %d\n", su);
printf("~su = %d\n", ~su);
출력:
su = 128
~su = -129
(~8을 구하면 0000 1000에서 1의 보수는 1111 0111이다. 이것의 -기 때문에 다시 2의 보수를 취하면 0000 1001이기 때문에 앞의 -는 가져오고 -9가 된다)
-----------------------------
(5)
int su = 5;
su++;
printf("su = %d\n", su);
++su;
printf("su = %d\n", su);
출력:
su = 6
su = 7
-------------------------------
(5)
int su = 5;
printf("su = %d\n", ++su); //prefix operator
printf("su = %d\n", su++); //postfix operator
출력:
su = 6
su = 6
------------------------------------
(5)
int a = 8;
int b = a++;
a=9, b=8 이 나온다.
-------------------------------------
(6)
int su = 128;
printf("su = %d\n", su);
printf("&su = %d\n", &su);
printf("&su = %u\n", &su);
printf("&su = %x\n", &su);
출력:
su = 128
&su = -1074424468
&su = 3220542828
&su = bff5956c
-----------------------------------------------
(7)
int num = 8;
int * ptr = #
* ptr = 100;
printf("num = %d\n", num);
출력:
num = 100
(포인터변수 ptr에 num의 주소값을 넣어준다. 포인터변수 ptr에 또 포인터를 달아줌으로써 num의 직접 접근을 해서 num의 값을 수정해 준다. 그래서 변경된 num의 값이 나온다.
--------------------------------------------
'Java & Oracle' 카테고리의 다른 글
c 제어문 day9 (0) | 2014.02.27 |
---|---|
c 입출력함수 day8 (0) | 2014.02.26 |
c 시작 day6 (0) | 2014.02.24 |
ftp 연결, ping day5 (0) | 2014.02.21 |
vi editor day5 (0) | 2014.02.21 |