/* 배열의 선언 */
type name[N];
type은 배열의 원소들의 타입이다. name은 배열의 이름이다.
N은 배열의 크기라고 하고, 자연수이고 상수이어야 한다.
위의 선언은 다음과 같은 변수들을 만들어 낸다.
name[0], name[1], ... , name[N-1]
대괄호 내에 있는 값들을 일컬어 인덱스라 한다.
변수를 불러내기 위해 인덱스 내에 또다른 변수가 들어갈 수 있다.

/* 배열의 초기화 */
배열의 초기화는 배열을 선언하는 문장 내에서만 가능하다.
type name[N] = { ~ } ;
또, 배열 간의 대입은 불가능하다. 또한, 배열을 초기화해줄 때, 배열의 크기를 적지 않는 경우 초기화 내용에 따라서 자동으로 크기가 지정된다.
문자열을 이용하여 초기화 할 수도 있다.
type name[] = "~";
물론 이는 ~의 내용을 모두 적은 뒤 NULL문자까지 마지막으로 저장하기 때문에 ~에 있는 글자 개수보다 하나 많은 개수의 원소를 가진다. cout객체를 통한 출력을 위해서는 필수인 것이 NULL이다. NULL은 출력 시 아무것도 출력되지 않는다.

/*배열의 원소의 개수*/
또한 sizeof(배열의 이름)/sizeof(name[0]) 를 이용해 배열의 원소의 개수를 구할 수 있다.

/*cout<<배열의이름; */
cout 객체를 통해 출력을 할 때,
 
cout << 배열의 이름
을 하면 원소가 차례대로 출력된다.

/* 문자열의 소개 */
문자열이란 마지막에 NULL문자가 위치하는 char타입(형) 배열이다.
cout 객체가 처리하는 char형 배열의 출력방식은, NULL(\0)이 나올 때 까지 배열의 원소(문자변수)를 반복 출력하는 것이다.
다음을 문자열 상수라 한다.
"문자열"

Posted by 망고스파게티 :

break;는 모든 중괄호에 대해서 오른중괄호 다음으로 벗어나도록 하는 역할을 한다.
(블럭 밖으로 빠져나와 다음 흐름으로 간다.) 가 아닌 것 같네...

하나의 제어구조를 빠져나와 그 다음 흐름으로 간다.

흠... 뭐라 정리해야하나.
continue;는 반복문에서, 흐름을 다음 번 반복으로 이동시킨(건너뛴)다.
Posted by 망고스파게티 :

while(A){ ~ }

A가 참(true, 1, NOT 0 )이면 ~를 실행하고 다시 A로 되돌아온다.
A가 거짓(false, 0 )이면 ~를 실행하지 않고 건너뛰어 다음 흐름으로 넘어간다.

do{ ~ } while(A);
이는 { ~ } while(A){ ~ } 과 똑같은 것이다.
~를 실행한다.
~를 실행했을 때, A가 참이면 ~를 실행하고 A가 거짓이면 다음으로 넘어간다.

for(A;B;C){ ~ }
제일 처음에 A를 실행하고, B가 참이면 ~를 실행하고 그 후 C를 실행한다.
B가 거짓이면 다음 흐름으로 넘어간다.
C를 실행했을 때 B가 참이면 ~를 실행하고 그 후 C를 실행한다.
C를 실행했을 때 B가 거짓이면 다음 흐름으로 넘어간다.

Posted by 망고스파게티 :

X ? A : B;

조건 X가 참이면 앞의 것(A), 아니면 뒤의 것(B)을 실행한(가진)다.

goto X;
X:

goto X;에 진입하면 X:의 뒤로 이동한다.
Posted by 망고스파게티 :




우선, n비트 짜리 비트열(bit string) a에 대해 그 각각의 비트들을 a1, a2, ..., an이라 하자. 순서는 상관없으나, 일반적으로는 왼쪽부터 오른쪽으로 서수를 매긴 것으로 본다.

이제 임의의 비트 수가 같은 두 비트열 A, B에 대해,
AND OR XOR NOT 연산을 해보자.

A&B == (A1&B1)(A2&B2)...(An&Bn)
A|B == (A1|B1)(A2|B2)...(An&Bn)
A^B == (A1^B1) ... (An&Bn)
~A == (~A1)(~A2)...(~An)

단, ~1 = 0, ~0 = 1
1&1 = 1, 1&0, 0&1, 0&0 = 0
0|0 = 0, 0|1, 1|0, 1|1 = 1
1^1, 0^0 = 0 , 1^0, 0^1 = 1
이와 같다. 그럼 조금 더 정리해보자.
눈썹연산(XOR)에 대해서...

A^B의 비트 중, 값이 1인 임의의 비트의 서수를 d라 하자.
또한 값이 0인 임의의 비트의 서수를 s라 하자.
그러면
Ad^Bd = 1 = Cd
As^Bs = 0 = Cs
라 하면
Cd와 Ad의 관계는 다음과 같다.
Ad가 1이면 Ad^Cd = 0, Ad가 0이면 Ad^Cd = 1
Cs와 As의 관계는 다음과 같다.
As가 1이면 As^Cs =  1, As가 0이면 As^Cs = 0

따라서 A^C는 Ai == Bi인 비트들, 즉 As를 그대로 갖고, 그 외 Ai != Bi인 비트들, 즉 Ad는 그 반대인 Bd로 바뀌게 된다.
그러므로 그 결과는 B와 일치한다.

따라서 다음과 같은 성질이 증명되었다.
A^(A^B) = B


쉬프트 연산자.

A가 A1A2...An일 때,
A>>1는 AnA1A2...A(n-1)과 같다.
A<<1은 A2A3...AnA1과 같다.

A>>N은 for(int i=0;i<N;i=i+1;){A = A>>1}에서의 A와 같다.
다시말해, A>>N은 (A>>(N-1))>>1과 같다.

A<<N은 for(int i=0;i<N;i=i+1;){A = A<<1}에서의 A와 같다.
다시말해, A<<N은 (A<<(N-1))<<1과 같다.

Posted by 망고스파게티 :

switch(N)
{
        case N1:
                ~
                break;
        case N2:
                ~
                break;
.
.
.
        case Nn:
                ~
                break;
        default:
                ~
}

흐름이 switch에 도달하면 N의 값과 같은 Ni의 값을 찾는다. (i = 1, 2, ... , n)
(단, Ni는 상수이다.)
그리고 흐름은 'case Ni:' 의 바로 뒤의 위치로 간다.
그러다가 다음 case문인 'caseN(i+1):' 을 만나면 그 바로 뒤로 간다.
하지만 'break'를 만나면 switch(){} 의 바로 다음 위치로 탈출한다.

모든 case에 해당되지 않는 경우 default로 이동한다. 하지만 default 역시 break가 내장되어 있는 것은 아니다. 그러나 마지막에 위치한다면 break문은 필요하지 않다.

대부분 switch/case문을 어느 하나의 경우만을 실행하는 데 쓴다. 그게 일반적이다. 하지만 어떻게 다르게 이용해볼 수도 있을 것이다.

참고/ case, default과 같은 것과 그에 해당하는 실행코드 부분 합쳐 블럭이라고 한다...(?)
Posted by 망고스파게티 :


if(X){~} : X의 값이 0이 아니면 '~'를 실행한다. 0이면 실행하지 않는다.

else {~} : 같은 중괄호 깊이(안)에 존재하는, 마지막으로 시행된 if문의 조건의 여집합 조건을 가진 if문과 똑같다.

else if(X){~} : else { if(X){~} }와 같다. 나같으면 차라리 안쓰겠다. 쓸데없이 따로 얘기해가지고. 어떤 병신이... 차라리 비축약형을 먼저 설명하고 그 축약형을 소개하던가.

위 세 가지 모두, ~가 한문장일 경우 {}를 벗겨도 무방하다.

Posted by 망고스파게티 :

//연산자의 의미
연산자는 피연산자와 결합하여 어떤 값이 되거나, 어떤 현상을 일으킨다.


//연산자의 대분류 : 피연산자에 영향을 주느냐 주지 않느냐, 그 자체가 하나의 값이 될 수 있느냐 없느냐, 즉 크게는 3가지로 나뉜다.

결합된 식이 어떤 값을 나타내는 연산자를 결합형 연산자, 피연산자에 영향을 주는 연산자를 촉매형 연산자라 한다. (!?)
(그냥 내가 비유한 작명이다.)
결합형이면서도 촉매형인 경우가 대입연산자... 인가?


// 연산자의 종류 [기본적인 연산자라 할 수 있겠다. 키워드를 제외하고 라이브러리 객체를 제외한, 그리고 기타 등등을 제외한.]
1. 대입연산자
2. 관계연산자, 논리연산자
3. 비트 단위 연산자
4. 쉬프트 연산자
5. 사칙연산자

// 연산자의 결합 우선 순위
부록을 봐라.


// 비트 단위 연산자
AND : &             OR : |             XOR : ^             NOT : ~
(두 개의 피연산자를 요구하는 비트 단위 연산에서 두 개의 피연산자는 같은 비트수를 가져야 한다. 당연한 이야기이다.)

이항 비트 연산자의 경우, 같은 위치의 비트들을 각각 비교한다. 
AND는 곱의 결과와 같다.[앤드]
OR은 둘 다 0인 위치는 0, 그렇지 않은 위치는 1이다.[오알]
XOR은 값이 서로 같은 위치는 0, 값이 서로 다른 위치는 1이다. [엑스오알]
NOT은 1은 0, 0은 1이다.[낫]
위의 개념들을 각각 하나의 유개념(이미 존재하는 개념, 개념의 단위, ...)으로 숙지하도록 하자. 컴퓨터에서 그 만큼 중요한 것들일 것이다.

// 쉬프트 연산자
피연산자의 오른쪽에 '>>' 또는 '<<'를 붙이고 그 오른쪽에 수를 덧붙인다.
피연산자의 비트들에 들어있는 값들은 그 수만큼 옆으로 이동한다.
비트열의 끝 칸을 지나면 반대편 끝 칸으로 이동한다.
'>>'일 경우 오른쪽, '<<'일 경우 왼쪽으로 이동한다.
쉬프트 연산자는 피연산자에 영향을 주지 않는다.

'X << N'는 X를 왼쪽으로 N번 쉬프트한 결과를 나타낸다.
'X >> N'는 X를 오른쪽으로 N번 쉬프트한 결과를 나타낸다.
'1번 쉬프트한다' : 모든 비트들에 들어있는 값들을 어떤 방향으로 한 비트 간격씩 이동시킨다. 옮길 비트 공간이 남지 않은 경우 값이 비게 될 자리로 옮긴다.

(두 번 설명하였다)
Posted by 망고스파게티 :


명시적인 형변환

1. 연산자와의 결합을 통한 새로운 임시 변수를 일시적으로 생성함
2. 대상 변수의 타입을 변화시킴

1의 경우

'(type)name' 라는 임시변수를 사용하면 된다.
괄호 안의 것이 타입이고, name이 가진 값을 담아 가지게 된다.

2의 경우.

아직 모름. 무슨 _cast ... 하는 것 같던데 뇌자극에서는 아직 안나옴.

묵시적인 형변환

대입연산자를 이용한다.
타입이 다른 두 변수를 피연산자로 하여 대입연산을 하게 되면, 오른쪽에 있는 것의 정보 부분(값)이 왼쪽에 있는 변수로 들어가게 되면서,
똑같은 값을 가지지만 타입이 다른 변수가 생겨나게 되는 셈이다.
이를 보고 묵시적인 형변환이라 한다.
Posted by 망고스파게티 :

정수 타입 (6개)
short int  (2 bytes)
int (4 bytes)
long int (4 bytes)
unsigned ~ (~의 크기와 같다)
int는 자연스러운 크기(운영체제의 처리 단위)에 맞게 할당된다. 32비트(=4바이트)의 경우 4바이트가 할당되는 것이다. 이 노트북(sensRF410)처럼.

long int와 int의 차이는??

sizeof() 의 괄호 안에 타입을 기입하거나 변수의 이름을 기입하면 그것은 그 크기를 나타내게 된다.


실수 타입
float
double
long double

문자 타입
char

아스키 코드, 작은 따옴표
문자를 작은따옴표로 둘러싸게 되면 그것은 어떤 수치가 되는데, 이 문자와 수치 간의 대응관계를 정리한 것이 아스키 코드이다.
그러한 수치를, 문자의 아스키코드값이라 한다.

문자형 변수에는 아스키코드값이 저장된다. 그리고 그 변수는 자신의 안에 담긴 내용을 내보낼 일이 있을 경우에, 그에 대응하는 문자로 내보낸다.

bool 타입
bool에 대입되는 true와 false는 각각 1과 0이다.
Posted by 망고스파게티 :