tag:blogger.com,1999:blog-22078560918822892842023-10-08T06:05:21.761+09:00C / C++Elex의 C/C++ 언어 노트Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.comBlogger29125tag:blogger.com,1999:blog-2207856091882289284.post-34082154689920686882013-09-10T16:40:00.000+09:002013-09-10T16:43:02.589+09:00C 표준, GCC 그리고 컴파일 옵션
GCC supports three versions of the C standard, although support for the most recent version is not yet complete.
The original ANSI C standard (X3.159-1989) was ratified in 1989 and published in 1990. This standard was ratified as an ISO standard (ISO/IEC 9899:1990) later in 1990. There were no technical differences between these publications, although the sections of the ANSI standard were Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-28787074363265513022013-09-10T04:19:00.004+09:002013-09-10T16:44:42.700+09:00iso646.h
iso646.h 파일은 일부 연산자에 사용되는 기호들을 사용하기 힘든 환경에서 이를 영문자로 대체하기 위한 목적으로 사용된다.
<!--
google_ad_client = "ca-pub-7196581333897022";
/* ANSI-C 본문 */
google_ad_slot = "8876647208";
google_ad_width = 336;
google_ad_height = 280;
//-->
(한글 키보드에서는 이런 문자들이 쉽게 입력 가능하므로 그닭...)
다음과 같이 11가지의 매크로가 정의되어 있다.
#define and &&
#define and_eq Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-62830185870092051282013-09-10T04:19:00.001+09:002013-09-10T16:44:42.706+09:00float.h
float.h 파일은 부동소수값을 나타내는데 필요한 요소들의 최대, 최소값 등을 나타내는 매크로 상수들로 구성되어 있다.
<!--
google_ad_client = "ca-pub-7196581333897022";
/* ANSI-C 본문 */
google_ad_slot = "8876647208";
google_ad_width = 336;
google_ad_height = 280;
//-->
부동 소수값은 부호(+, -)와 함께 다음과 같은 요소들로 구성된다. (매크로 상수의 이름으로 사용되는 부분은 대문자로 표시하였다.)
MANTissa * RADIXEXPonent
#include <stdio.h>
#include <Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-3715704302423005822013-09-10T01:20:00.002+09:002013-09-10T16:44:42.703+09:00assert.h
<!--
google_ad_client = "ca-pub-7196581333897022";
/* ANSI-C 본문 */
google_ad_slot = "8876647208";
google_ad_width = 336;
google_ad_height = 280;
//-->
assert.h 파일은 프로그래밍 단계에서 오류 검증 목적으로 사용되는 assert()라는 매크로 함수 단 하나만을 정의하고 있다. 단, 소스 파일에 NDEBUG가 정의되어 있는 때에는 작동하지 않는데, NDEBUG는 다음과 같이 정의한다.
#define NDEBUG
assert(expression)
assert()는 디버깅의 용도로 사용되는데 매개변수 값이 0 (즉, false)인 경우에 프로그램을 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-23824185043616477872013-09-10T01:19:00.003+09:002013-09-10T16:44:42.697+09:00errno.h
errno.h 파일에는 오류 코드를 기억할 수 있는 errno가 매크로로 정의되어 있고, 그 외에 각종 오류 코드 넘버들이 매크로 상수로 정의되어 있다.
<!--
google_ad_client = "ca-pub-7196581333897022";
/* ANSI-C 본문 */
google_ad_slot = "8876647208";
google_ad_width = 336;
google_ad_height = 280;
//-->
프로그램 시작시에는 errno의 값이 0으로 초기화되며, 특정 오류가 발생한 때에는 이 값이 해당 오류 코드로 바뀐다. 프로그램에서도 이 값을 읽거나 수정할 수 있다.
#include <stdio.h>
#include <Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-85066681903371674512013-09-10T01:19:00.000+09:002013-09-10T16:44:42.709+09:00ctype.h
ctype.h 파일에는 문자의 종류를 판별( is...() )하거나 대소문자를 변경( to...() )하는 함수들이 정의되어 있다.
<!--
google_ad_client = "ca-pub-7196581333897022";
/* ANSI-C 본문 */
google_ad_slot = "8876647208";
google_ad_width = 336;
google_ad_height = 280;
//-->
int isalnum(int ch);
문자 ch가 영문자 혹은 숫자인 경우에는 0이 아닌 값 (즉, true)를 반환하고, 그렇지 않은 때에는 0 (false)를 반환한다. 매개변수 ch는 int 형으로 형변환된다.
A ~ Z, a~ z, 0 ~ 9
int Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-15098062406687382452012-09-06T23:47:00.000+09:002012-09-06T23:47:15.161+09:00File IO1. 외부 파일 이름 대신에 사용할 파일 변수를 선언
FILE * 파일변수;
2.
파일변수 = fopen("파일이름.확장자", "w");
3. 파일에 출력 작업을 수행
fputc ('문자', 파일변수);
fputs ("문자열 및 제어문자", 파일변수);
fprintf (파일변수, "문자열 및 서식", 출력대상);
4. 출력 작업이 모두 끝나면 파일을 닫아준다.
fclose(파일변수);
프린터로 출력하려면 파일 출력 함수의 파일 변수 부분에 stdprn을 적고, 화면으로 출력하려면 stdout을 적는다.
fgetc(파일변수);
fgets(문자열변수, 읽을 글자 수 +1, 파일변수);
fscanf(파일변수, "입력서식", &변수);
feof(파일변수);파일 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com1tag:blogger.com,1999:blog-2207856091882289284.post-46669092066614288922012-08-31T01:02:00.002+09:002012-08-31T01:02:42.318+09:00매개변수
Call by name
int func1()
Call by value
int func1(int a, ...)
Call by address
int func1(int *a, ...)
Call by reference
호출함수
int func1(&a, &b)
피호출함수
int func1(int *a, int *b)
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-80573584543418882702012-08-31T00:41:00.000+09:002012-08-31T00:41:40.123+09:00연산자 우선 순위
()(괄호) [](배열) ->(포인터멤버) .(구조체멤버)
!(부정) ~(1의보수) ++(증가) --(감소) -(부호) +(부호) (자료형)(형변환) *(포인터) &(주소) sizeof
*(곱셈) /(나눗셈) %(나머지)
+(덧셈) -(뺄셈)
<< >>(비트이동)
< <= > >=(관계)
== !=(관계)
&(비트논리곱)
^(비트배타논리합)
|(비트논리합)
&&(논리곱)
||(논리합)
?:(조건)
=(할당) += -= *= /= %= &= ^= |= <<= >>=(복합할당)
,(쉼표)
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com2tag:blogger.com,1999:blog-2207856091882289284.post-3735275662099167482012-08-30T23:45:00.000+09:002012-08-30T23:45:59.501+09:00Error와 Warning
Error
소스 파일 번역시에 문법 상의 오류인 때에 출력. 에러가 있는 경우에는 링킹을 한다거나 실행할 수 없다.
Warning
번역 또는 링킹시에 발생. 경미한 오류인 경우에 출력. 경고를 무시해도 실행파일이 생성된다.
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-57706133775072419062012-08-30T19:25:00.003+09:002012-08-30T19:25:37.907+09:00전처리기컴파일러에 앞서서 사용자가 정의한 각종 내용을 미리 처리한다.
반드시 #으로 시작하며 문장의 끝에는 세미콜론이 붙지 않는다.
소스 파일의 첫 부분에 위치하며, 첫 칸부터 시작해서 입력하고 한 줄에 하나씩의 명령을 입력한다.
#include
헤더파일 등을 포함. 컴파일러의 기본 경로에 있는 파일은 < >안에, 현재 소스의 경로에 있는 때에는 " "안에 파일명을 입력한다.
#define
매크로를 정의. 선행처리기는 매크로와 대응하는 내용을 빈칸을 통해서 구분한다.
매크로 상수
1 #define PI 3.141592
매크로 함수
1 #define SQUARE(x) ((x)*(x))
2 #define PRINTOUT(x) printf(#x)
매개변수에 따옴표를 포함시키려면 #을 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-85980447884464342842012-08-30T19:18:00.000+09:002012-08-31T01:11:55.377+09:00기억부류변수에 저장된 값이 유효하게 사용될 수 있는 프로그램 내에서의 범위를 변수의 범위라고 한다. 변수의 사용영역에 따라 지역변수, 전역변수로 나뉠 수 있고, 변수의 존속기간에 따라 자동변수, 정적변수, 외부변수, 레지스터변수로 나뉠 수 있다.
외부 변수
전역 변수라고도 하며, 다른 함수에서 정의된 변수를 공유하고자 할 때 사용한다.
함수의 밖에서 선언되며, 여러 소스 파일 간에 사용하려는 때에는 extern 키워드를 사용한다. extern은 실제로 변수를 선언하는 것이 아니라 다른 파일에서 변수가 선언되었음을 알려주는 역할을 한다.
초기화되지 않은 경우에 0값을 가짐. 외부변수와 프로그램 데이터가 저장되는 데이터 세그먼트에 저장된다.
1 #include <stdio.h>
2
3 /*
4Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-21606219077266543232012-08-30T19:09:00.001+09:002012-08-30T19:09:19.947+09:00구조체구조체란 여러가지 자료형을 묶어놓은 집합적인 자료형이다.
구조체의 정의
1 struct 구조체명
2 {
3 int x;
4 int y;
5 }
구조체의 선언
1 struct animal
2 {
3 ...
4 } dog, cat;
1 struct animal
2 {
3 ...
4 }
5 ...
6 struct animal dog, cat;
구조체의 초기화
1 struct animal
2 {
3 int color;
4 ...
5 } dog = {.., .., ..};
구조체의 멤버
구조체의 멤버를 사용하려면 .연산자를 사용한다.
1 dog.color;
구조체를 멤버로 가지는 구조체
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-36394042956655001062012-08-30T19:01:00.001+09:002012-08-30T19:01:51.540+09:00공용체공용체는 하나의 메모리 공간을 여러 개의 자료형이나 변수가 공유하는 것이다.
정의
union 키워드를 사용하며, 공용체의 멤버는 반드시 정수형이거나 문자형이어야 한다. 각각의 멤버는 전체 길이가 같아야 한다.
1 union REG
2 {
3 int ax;
4 short ah, al;
5 }
멤버의 사용
구조체와 마찬가지로 .연산자를 사용해서 멤버에 접근할 수 있다.Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-62652573270581482122012-08-30T18:29:00.000+09:002012-08-31T01:21:32.936+09:00포인터포인터는 다른 변수의 주소값을 가지는 특별한 변수이다.
*는 포인터의 내용 연산자이다.
&는 포인터의 주소 연산자이다.
일반 변수포인터 변수
선언 int a; // 정수형 변수 a int *a; // 포인터 변수 a를 종수형으로 선언
값 할당 int a = 100; // 변수 a에 100할당 *a = 100; // a 주소에 100 할당
주소 참조 &a; // 변수 a의 주소 a; // 주소
주소 연산 할 수 없음 a--; // 포인터를 1 감소
선언
1 자료형* 포인터변수명;
1 int* p;
변수 p는 포인터 변수이며, 정수형의 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-38290448685376543332012-08-30T18:15:00.002+09:002012-08-30T18:15:23.190+09:00배열배열은 동일한 자료형으로 구성된 기억 장소의 집합이다. 배열 내의 특정 위치를 지칭하기 위해서 첨자를 사용한다. 배열의 첨자는 대괄호 [ ]로 표현한다. 배열의 요소는 항상 0부터 시작하며, 마지막 요소의 번호는 n-1이 된다. 배열명은 배열의 시작 주소이다.
1 자료형 배열명[갯수];
다차원 배열
2차원 배열은 2개의 첨자를 가지며, 3차원 배열은 3개의 첨자를 가진다. 배열의 차원에는 제한이 없다.
2차원 배열의 요소는 1차원 배열이다. 2차원 배열에서 행의 숫자는 생략할 수 있다.
1 자료형 배열명[갯수][갯수];
초기화
1 int arr[4] = {10, 20, 30, 40};
2 int arr[] = {10, 20, 30, 40};
3 int arr[4][2] = {10Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-73042339163494229422012-08-30T00:33:00.000+09:002012-08-30T00:40:20.500+09:00함수
함수의 구조
1 반환_자료형 함수이름 (매개변수_자료형 매개변수)
2 {
3 ...
4 return 반환값;
5 }
헤더
리턴 값의 자료형, 함수의 이름, 매개변수 목록으로 구성된다. 리턴 값이 없을 때는 void를 사용한다.
몸체
중괄호 안에 명령문들로 구성된다.
매개변수 전달
전달받을 매개변수의 목록을 자료형과 변수명으로 입력하며, 필요한 만큼 쉼표로 연결해서 나열한다.
전달받은 매개변수는 함수 내에서 지역변수로 사용된다.
반환값
return 키워드를 사용해서 값을 반환하고 함수가 종료된다.
함수의 호출
함수의 이름과 매개변수를 사용해서 호출할 수 있으며, 결과 값을 받으려는 경우에는 할당문의 오른쪽에 사용한다.
프로토타입
1 반환_자료형 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-51171284060163669102012-08-29T20:55:00.001+09:002012-08-29T20:56:12.884+09:00분기문
goto
프로그램의 흐름을 특정 문장으로 이동시킨다. goto문과 대응되는 레이블이 존재해야 한다.
1 #include <stdio.h>
2
3 /*
4 분기
5 */
6
7 int main ()
8 {
9
10 printf("출력됨 1\n");
11 goto label1;
12 printf("출력안됨\n");
13 label1:
14 printf("출력됨 2\n");
15
16 system("PAUSE");
17 return 0;
18 }
continue
반목문에서 사용되며 흐름을 continue 다음부터 반복문의 마지막 문장까지를 실행하지 않고 다음 반복이 계속된다.
1 #include &Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-79586783309160654282012-08-29T20:46:00.000+09:002012-08-31T00:47:10.786+09:00반복문
for
1 for (초기값; 조건; 증감식)
2 {
3 명령문;
4 }
while
1 while (조건)
2 {
3 명령문;
4 }
do - while
1 do
2 {
3 명령문;
4 } while (조건);
최소한 한 번은 실행되어야 하는 경우에 사용된다.
무한루프
1 for (; ;)
2 {
3 명령문;
4 }
1 while (1)
2 {
3 명령문;
4 }
1 do
2 {
3 명령문;
4 } while (1);
C 언어에서, 0이 아닌 값은 모두 참이다.
Example :
1 #include <stdio.h>
2
3 /*
4 구구단
5 */
6
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-15373131021749896762012-08-29T20:01:00.000+09:002012-08-31T00:46:25.735+09:00조건문
if
1 if (조건) 명령문;
if - else
1 if (조건)
2 {
3 명령문1;
4 }
5 else
6 {
7 명령문2;
8 }
if - else if
1 if (조건)
2 {
3 명령문1;
4 }
5 else if
6 {
7 명령문2;
8 }
9 else
10 {
11 명령문3;
12 }
switch - case
case절에는 break문을 사용해서 다른 절이 실행되지 않도록 해야 한다.
case절에서 제시된 조건 중에 하나도 맞지 않는 경우에 default절이 실행된다.
1 switch (조건)
2 {
3 case 값1:
4 명령문1;
5 break;
6
7Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-51441098382041216612012-08-29T19:32:00.002+09:002012-08-29T19:41:20.122+09:00특수문자와 서식화 문자
ASCII 특수 문자
\a
경고음 발생
\b
백스페이스
\f
폼 피드
\n
개행
\r
캐리지 리턴
\t
수평 탭
\v
수직 탭
\\
역 슬래시 (\)
\'
작은 따옴표 (')
\"
큰 따옴표 (")
서식 문자
%d, %i
10진 정수
%x, %o
16진수, 8진수 정수(양수만)
%f, %lf
10진수 실수
%c
하나의 문자
%s
문자열
%u
10진 정수 (양수만)
%e
지수표기법에 의한 실수
%E
지수표기법에 의한 실수
%g
소수점 이하 자리수에 따라 %f, %e중 하나를 선택
%G
소수점 이하 자리수에 따라 %f, %e 중 하나를 선택
%%
%기호 출력
%03d
필드 폭을 3칸 확보하고 남는 자리는 0으로 채움
%-3d
필드 폭을 3칸 확보하고 왼쪽 정렬
%+3d
필드 폭을 3칸 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-24563594111799530332012-08-29T19:18:00.000+09:002012-08-31T01:13:06.752+09:00문자와 문자열C언어에서는 내부적으로 문자와 숫자가 동일한 것으로 취급된다는 것에 주의해야 한다.
문자
문자는 작은 따옴표 ' '안에 표현하고, 문자열은 큰 따옴표 " " 안에 표현한다.
문자에 실제로 저장되는 값은 아스키 코드 값이다.
1 #include <stdio.h>
2
3 /*
4 문자
5 */
6
7 int main ()
8 {
9 char ch, cha;
10 ch = 'a';
11 cha = 97;
12 printf("%c\n", ch);
13 printf("%c\n", cha);
14 system("PAUSE");
15 return 0;
16 }
문자열
문자열을 위한 별도의 자료형은 존재하지 Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-59681097952649501522012-08-29T19:06:00.000+09:002012-08-29T19:06:26.436+09:00연산자
할당 연산자
=
복합 할당 연산자
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
산술 연산자
+, -, *, /, %
증감 연산자
++, --
관계 연산자
==, !=,
<, <=, >, >=
논리 연산자
!, &&, ||
조건 연산자
? :
쉼표 연산자
,
부호 연산자
-
비트 연산자
~, &, |, ^,
<<, >>
형변환 연산자
(자료형)
sizeof 연산자
sizeof
구조체멤버
., ->
포인터, 참조
&, *, [ ]
괄호 연산자
( )
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-64693727328042511122012-08-29T18:54:00.000+09:002012-08-29T19:20:40.267+09:00상수상수는 변수와 유사하지만, 변수와는 달리 항상 일정한 값이 보존되므로, 이 값을 변경할 수 없다.
상수를 정의하는 두가지 방법이 있다.
#define
매크로 상수라고 한다.
1 #define PI 3.141592
const
1 const double pi = 3.141592;
Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0tag:blogger.com,1999:blog-2207856091882289284.post-66813554665887536192012-08-29T18:41:00.001+09:002012-08-29T19:20:49.364+09:00변수변수는 데이터를 임시로 저장하는 메모리 공간이다.
변수명
영문자, 숫자, 밑줄문자로 구성된다.
영문자 또는 밑줄문자로 시작해야 한다.
대소문자가 구분된다.
예약어(키워드)는 사용할 수 없다.
변수의 선언
자료형 변수명;
변수의 선언은 소스 코드의 앞부분에 몰아서 해야 한다.
선언과 동시에 초기화할 수도 있다.
1 int i;
2 int j = 0;
변수의 초기화
초기화 되지 않은 변수는 0이 아닌 임의의 값을 가지고 있다.
변수의 범위
일반적으로 함수 내에서 선언된 변수는 지역변수이며 함수의 종료와 함께 소멸된다.
1 #include <stdio.h>
2
3 /*
4 지역 변수
5 */
6 void fun1()
7 {
8 int x =Elexhttp://www.blogger.com/profile/04776810249062811247noreply@blogger.com0