C(프로그래밍 언어)
C (programming language)패러다임 | 다중 패러다임: 명령형(절차형), 구조형 |
---|---|
설계자 | 데니스 리치 |
개발자 | ANSI X3J11(ANSI C), ISO/IEC JTC 1(공동기술위원회 1)/SC 22(분과위원회 22)/WG 14(작업반 14)(ISOC) |
처음 등장했습니다. | 1972년, | 전 1972)
안정적 방출 | C17 / 2018년 6월; ~06년 |
미리보기 릴리스 | |
타이핑 종목 | 정적, 약함, 명백함, 공칭 |
OS | 크로스 플랫폼 |
파일 이름 확장자 | .c, .h |
웹사이트 | www www |
주요 구현 | |
pcc, GCC, Clang, Intel C, C++Builder, Microsoft Visual C++, Watcom C | |
방언 | |
사이클론, Unified Parallel C, Split-C, Cilk, C* | |
에 의해 영향을 받았습니다. | |
B(BCPL, CPL), ALGOL 68,[4] PL/I, FORTRAN | |
영향받은 | |
Numerous: AMPL, AWK, csh, C++, C--, C#, Objective-C, D, Go, Java, JavaScript, JS++, Julia, Limbo, LPC, Perl, PHP, Pike, Processing, Python, Rust, Seed7, V (Vlang), Vala, Verilog (HDL),[5] Nim, Zig | |
C(발음 / ˈ si ː/ – 문자 c처럼)는 범용 컴퓨터 프로그래밍 언어입니다. 그것은 1970년대에 데니스 리치에 의해 만들어졌고, 매우 널리 사용되고 영향력을 행사하고 있습니다. 설계상 C의 기능은 대상 CPU의 기능을 깨끗하게 반영합니다. 운영 체제, 장치 드라이버 및 프로토콜 스택에서 지속적인 사용을 발견했지만 응용 소프트웨어에서의 사용은 감소하고 있습니다.[7] C는 가장 큰 슈퍼컴퓨터부터 가장 작은 마이크로컨트롤러 및 임베디드 시스템에 이르는 컴퓨터 아키텍처에서 일반적으로 사용됩니다.
프로그래밍 언어 B의 후속인 C는 원래 1972년에서 1973년 사이에 Ritchie에 의해 Unix에서 실행되는 유틸리티를 구성하기 위해 Bell Labs에서 개발되었습니다. 유닉스 운영체제의 커널을 재구현하는데 적용되었습니다.[8] 1980년대 동안 C는 점차 인기를 얻었습니다. C 컴파일러는 거의 모든 현대 컴퓨터 아키텍처와 운영 체제에서 사용할 수 [9][10]있는 가장 널리 사용되는 프로그래밍 언어 중 하나가 되었습니다. 원래 언어 디자이너가 공동 집필한 C 프로그래밍 언어라는 책은 수년 동안 사실상의 언어 표준으로 사용되었습니다.[11][1] C는 1989년부터 미국 표준 협회(ANSI)와 국제 표준화 기구(ISO)에 의해 표준화되었습니다.
C는 정적 유형 시스템과 함께 구조화된 프로그래밍, 어휘 변수 범위 및 재귀를 지원하는 필수 절차 언어입니다. 최소한의 런타임 지원으로 머신 명령어에 효율적으로 매핑되는 메모리 및 언어 구성에 대한 낮은 수준의 액세스를 제공하도록 컴파일되도록 설계되었습니다. 낮은 수준의 기능에도 불구하고 이 언어는 플랫폼 간 프로그래밍을 장려하도록 설계되었습니다. 휴대성을 염두에 두고 작성된 표준 준수 C 프로그램은 소스 코드를 거의 변경하지 않고 다양한 컴퓨터 플랫폼 및 운영 체제에 대해 컴파일할 수 있습니다.[12]
2000년 이후, C는 프로그래밍 언어의 인기를 측정하는 TIOBE 지수에서 꾸준히 상위 2개 언어에 속했습니다.[13]
개요
C는 ALGOL 전통에서 필수적이고 절차적인 언어입니다. 정적 유형 시스템이 있습니다. C에서 모든 실행 코드는 서브루틴(기능 프로그래밍의 의미는 아니지만 "기능"이라고도 함) 내에 포함됩니다. 함수 매개 변수는 값별로 전달되지만 배열은 포인터로 전달됩니다. 즉 배열의 첫 번째 항목의 주소입니다. Pass-by-Reference는 참조되는 것에 대한 포인터를 명시적으로 전달함으로써 C에서 시뮬레이션됩니다.
C 프로그램 소스 텍스트는 자유 형식 코드입니다. 세미콜론은 문을 종료하는 반면, 곱슬곱슬한 괄호는 문을 블록으로 그룹화하는 데 사용됩니다.
C 언어는 또한 다음과 같은 특징을 나타냅니다.
- 언어에는 제어 흐름 기본 요소의 전체 집합을 포함하여 적은 수의 고정된 키워드가 있습니다.
if/else
,for
,do/while
,while
,그리고.switch
. 사용자 정의 이름은 어떤 종류의 기호로도 키워드와 구분되지 않습니다. - 많은 수의 산술 연산자, 비트 단위 연산자 및 논리 연산자를 가지고 있습니다.
+
,+=
,++
,&
, - 하나의 문에서 둘 이상의 할당을 수행할 수 있습니다.
- 기능:
- 데이터 타이핑은 정적이지만 약하게 적용됩니다. 모든 데이터에 유형이 있지만 암시적 변환이 가능합니다.
- 사용자 정의(타입디프) 및 복합형이 가능합니다.
- 이기종 집계 데이터 유형(
struct
)를 통해 관련 데이터 요소를 하나의 단위로 액세스하고 할당할 수 있습니다. 전체 구조물의 내용은 단일 내장 연산자를 사용하여 비교할 수 없습니다(요소는 개별적으로 비교해야 함). - Union은 여러 데이터 유형이 동일한 메모리 위치를 공유할 수 있도록 하는 중복된 구성원이 있는 구조입니다.
- 배열 인덱싱은 포인터 산술의 용어로 정의되는 2차 표기법입니다. 내장된 단일 연산자를 사용하여 전체 어레이를 할당하거나 비교할 수 없습니다. 사용 중이거나 정의 중인 "array" 키워드가 없습니다. 대신 대괄호는 구문적으로 배열을 나타냅니다. 예를 들어,
month[11]
. - 열거된 유형은 다음을 사용하여 가능합니다.
enum
키워드. 정수와 자유롭게 상호 변환할 수 있습니다. - 문자열은 구별되는 데이터 유형이 아니지만 일반적으로 null-termined 문자 배열로 구현됩니다.
- 이기종 집계 데이터 유형(
- 기계 주소를 포인터로 변환하여 컴퓨터 메모리에 대한 낮은 수준의 접근이 가능합니다.
- 프로시저(값을 반환하지 않는 서브루틴)는 빈 반환 유형을 갖는 함수의 특수한 경우입니다.
void
. - 라이브러리 루틴에 대한 호출이 있는 프로그램에 메모리를 할당할 수 있습니다.
- 전처리기는 매크로 정의, 소스 코드 파일 포함 및 조건부 컴파일을 수행합니다.
- 모듈화의 기본적인 형태는 다음과 같습니다. 파일은 별도로 컴파일되고 서로 연결될 수 있으며, 어떤 기능과 데이터 개체를 통해 다른 파일에 표시할 수 있는지에 대한 제어와 함께 다음과 같은 방법을 통해 확인할 수 있습니다.
extern
특성. - 입출력, 문자열 조작, 수학적 기능 등 복잡한 기능은 라이브러리 루틴에 일관성 있게 위임됩니다.
- 컴파일 후 생성된 코드는 기반 플랫폼에서 비교적 간단한 요구 사항을 가지고 있으므로 운영 체제를 만들고 임베디드 시스템에서 사용하기에 적합합니다.
C는 다른 언어에서 볼 수 있는 특정 기능(예: 객체 방향 및 가비지 컬렉션)을 포함하지 않지만, 이러한 기능은 종종 외부 라이브러리(예: GLib Object System 또는 Boehm 가비지 컬렉션)를 사용하여 구현하거나 에뮬레이트할 수 있습니다.
타언어와의 관계
Many later languages have borrowed directly or indirectly from C, including C++, C#, Unix's C shell, D, Go, Java, JavaScript (including transpilers), Julia, Limbo, LPC, Objective-C, Perl, PHP, Python, Ruby, Rust, Swift, Verilog and SystemVerilog (hardware description languages).[5] 이 언어들은 C에서 제어 구조와 다른 기본적인 특징들을 많이 이끌어냈습니다. 이들 대부분은 C와 매우 유사한 구문을 표현하기도 하며, C의 인식 가능한 표현과 문장 구문을 근본적으로 다를 수 있는 유형 시스템, 데이터 모델 및 의미론과 결합하는 경향이 있습니다.
역사
초기 개발
연도 | 격식을 차리지 않는 이름. | 공식적인 표준. |
---|---|---|
1972 | 제1차 발매 | — |
1978 | 케이앤알씨 | — |
1989, 1990 | ANSI C, C89, ISO C, C90 | ANSI X3.159-1989 ISO/IEC 9899:1990 |
1999 | C99, C9X | ISO/IEC 9899:1999 |
2011 | C11, C1X | ISO/IEC 9899:2011 |
2018 | C17 | ISO/IEC 9899:2018 |
2024 | C23, C2X | ISO/IEC 9899:2024 |
미래. | C2Y | — |
C의 기원은 원래 Dennis Ritchie와 Ken Thompson이 PDP-7에 어셈블리 언어로 구현한 유닉스 운영 체제의 개발과 밀접한 관련이 있습니다. 결국, 그들은 운영 체제를 PDP-11로 이식하기로 결정했습니다. 유닉스의 원래 PDP-11 버전도 어셈블리어로 개발되었습니다.[8]
B
Thompson은 새로운 플랫폼을 위한 유틸리티 개발을 위한 프로그래밍 언어를 원했습니다. 처음에 그는 포트란 컴파일러를 쓰려고 했지만 곧 그 아이디어를 포기했습니다. 대신, 그는 BCPL이라고 불리는 최근에 개발된 시스템 프로그래밍 언어의 축소판을 만들었습니다. 당시[14] BCPL에 대한 공식적인 설명은 제공되지 않았으며 Thompson은 SMALGOL로 알려진 단순화된 ALGOL과 유사하게 구문을 덜 말하도록 수정했습니다.[15] 톰슨은 결과를 B라고 불렀습니다.[8] 그는 B를 "SMALGOL 구문이 많은 BCPL 의미론"이라고 설명했습니다.[15] BCPL과 마찬가지로 B에는 부트스트래핑 컴파일러가 있어 새 컴퓨터로의 이식을 용이하게 했습니다.[15] 그러나 너무 느리고 바이트 주소 지정성과 같은 PDP-11 기능을 활용할 수 없었기 때문에 궁극적으로 B로 작성된 유틸리티는 거의 없었습니다.
New B 및 첫 번째 C 릴리스
1971년 리치는 보다 강력한 PDP-11의 기능을 활용하기 위해 B를 개선하기 시작했습니다. 중요한 추가 사항은 문자 데이터 유형이었습니다. 그는 이것을 New B(NB)라고 불렀습니다.[15] 톰슨은 유닉스 커널을 쓰기 위해 NB를 사용하기 시작했고, 그의 요구사항은 언어 개발의 방향을 형성했습니다.[15][16] 1972년까지 더 풍부한 유형들이 NB 언어에 추가되었습니다. NB에는 다음과 같은 배열이 있습니다. int
그리고. char
. 포인터, 다른 유형에 대한 포인터를 생성하는 기능, 모든 유형의 배열, 함수에서 반환할 유형도 모두 추가되었습니다. 식 내의 배열이 포인터가 되었습니다. 새로운 컴파일러가 작성되었고, 언어의 이름은 C로 바뀌었습니다.[8]
C 컴파일러와 그것으로 만들어진 일부 유틸리티는 리서치 유닉스라고도 알려진 버전 2 유닉스에 포함되었습니다.[17]
구조 및 유닉스 커널 재작성
1973년 11월에 출시된 버전 4 유닉스에서 유닉스 커널은 C로 광범위하게 재구현되었습니다.[8] 이때쯤 C 언어는 다음과 같은 몇 가지 강력한 기능을 획득했습니다. struct
종류들.
전처리기는 1973년경 앨런 스나이더(Alan Snyder)의 권유로 도입되었으며 BCPL과 PL/I에서 사용할 수 있는 파일 포함 메커니즘의 유용성을 인정받아 도입되었습니다. 원래 버전은 파일과 간단한 문자열 교체만 제공했습니다. #include
그리고. #define
매개변수가 없는 매크로입니다. 그 직후, 대부분 Mike Lesk에 의해 확장되었고, 그 다음 John Reiser에 의해 인수와 조건부 컴파일이 포함된 매크로가 통합되었습니다.[8]
유닉스는 어셈블리가 아닌 언어로 구현된 최초의 운영 체제 커널 중 하나였습니다. 이전의 예로는 1961년 버로우즈 B5000(ALGOL로 작성)을 위한 멀틱스 시스템(PL/I로 작성)과 마스터 컨트롤 프로그램(MCP)이 있습니다. 1977년경 리치와 스티븐 C. Johnson은 유닉스 운영 체제의 휴대성을 용이하게 하기 위해 언어에 추가적인 변화를 주었습니다. 존슨의 휴대용 C 컴파일러는 새로운 플랫폼에서 C를 여러 번 구현하는 데 기반이 되었습니다.[16]
케이앤알씨
1978년 브라이언 커니건과 데니스 리치는 C 프로그래밍 언어의 첫 번째 판을 출판했습니다.[18] 저자의 이니셜에서 K&R로 알려진 이 책은 수년 동안 언어의 비공식적인 사양으로 사용되었습니다. 설명하는 C의 버전은 일반적으로 "K&RC"라고 합니다. 이것은 1978년에 출시되었기 때문에 현재는 C78이라고도 합니다.[19] 이[20] 책의 두 번째 판은 아래에 설명된 나중의 ANSI C 표준을 다룹니다.
K&R은 다음과 같은 몇 가지 언어 기능을 도입했습니다.
- 표준 I/O 라이브러리
long int
데이터 유형unsigned int
데이터 유형- 양식의 복합 할당 연산자
=op
(예를 들어)=-
)를 양식으로 변경하였습니다.op=
(즉,-=
) 다음과 같은 구성에 의해 생성되는 의미적 모호성을 제거하기 위한 것입니다.i=-10
, 로 해석되었던i =- 10
(decre)i
10) 의도할 수 있는 것 대신에i = -10
(렛트i
-10).
1989년 ANSI 표준이 발표된 이후에도, 수년 동안 K&RC는 많은 오래된 컴파일러가 여전히 사용되고 있었고, 신중하게 작성된 K&RC 코드도 합법적인 표준 C가 될 수 있기 때문에 C 프로그래머가 최대 휴대성을 원할 때 자신을 제한하는 "가장 낮은 공통 분모"로 여전히 여겨졌습니다.
C의 초기 버전에서는 이외의 유형을 반환하는 기능만 사용합니다. int
함수 정의 이전에 사용된 경우 선언해야 합니다. 사전 선언 없이 사용된 함수는 반환 유형으로 추정됩니다. int
.
예:
긴 어떤_기능(); /* 이것은 함수 선언이므로 컴파일러는 이 함수의 이름과 반환 유형을 알 수 있습니다.*/ /* int */ 기타_기능(); /* 또 다른 기능 선언입니다. 이것은 C의 초기 버전이기 때문에 여기에는 암묵적인 'int' 유형이 있습니다. 주석은 이후 버전에서 명시적인 'int' 유형 지정자가 필요한 위치를 보여줍니다.*/ /* int */ 호출_기능() /* {colly brackets}(으)로 이어지는 코드 본문을 포함한 함수 정의입니다. 반환 유형이 지정되지 않았기 때문에 이 함수는 C의 초기 버전에서 암시적으로 'int'를 반환합니다.*/ { 긴 test1; 등록하세요 /* int */ test2; /* 여기서 'int'는 필요하지 않습니다. 'int' 유형 지정자 */ /* 코멘트는 C의 이후 버전에서 필요합니다.*/ /* 'register' 키워드는 컴파일러에 이 변수가 */를 표시합니다. /* 스택 프레임 내가 아닌 레지스터에 저장하는 것이 이상적입니다.*/ test1 = 어떤_기능(); 한다면 (test1 > 1) test2 = 0; 또 다른 test2 = 기타_기능(); 돌아가다 test2; }
그 int
주석이 달린 형식 명세는 K&RC에서는 생략될 수 있지만 이후의 표준에서는 필요합니다.
K&R 함수 선언에 함수 인수에 대한 정보가 포함되어 있지 않았기 때문에 함수 매개 변수 유형 검사는 수행되지 않았지만 일부 컴파일러는 잘못된 수의 인수로 로컬 함수가 호출되면 경고 메시지를 발행하지만, 또는 외부 함수에 대한 서로 다른 호출이 서로 다른 숫자 또는 유형의 인수를 사용한 경우. 유닉스의 보풀 유틸리티와 같은 여러 소스 파일 간에 기능 사용의 일관성을 확인할 수 있는 별도의 도구가 개발되었습니다.
K&RC가 발표된 후 몇 년 동안, AT&T(특히 PCC[21])와 일부 다른 벤더의 컴파일러에 의해 지원되는 몇 가지 기능이 언어에 추가되었습니다. 여기에 포함된 내용:
void
함수(즉, 반환 값이 없는 함수)- 함수 반환
struct
또는union
유형(이전에는 단일 포인터, 정수 또는 플로트만 반환 가능) - 을 위한 할당
struct
데이터 유형 - 열거된 유형(예: 정수 고정 값에 대한 전처리기 정의)이 사용되었습니다.
#define GREEN 3
)
언어의 인기와 유닉스 컴파일러조차 K&R 사양을 정확하게 구현하지 못했던 점과 함께 표준 라이브러리에 대한 많은 확장 기능과 합의 부족은 표준화의 필요성으로 이어졌습니다.[citation needed]
ANSI C 및 ISO C
1970년대 후반과 1980년대 사이에 C의 버전은 IBM PC를 포함한 다양한 메인프레임 컴퓨터, 미니컴퓨터, 마이크로컴퓨터를 위해 구현되었습니다.
1983년 미국 국가 표준 연구소(ANSI)는 위원회인 X3J11을 구성하여 유닉스 구현에 기반한 C 표준에 기초한 C. X3J11의 표준 규격을 제정했습니다. 그러나 유닉스 C 라이브러리의 휴대가 불가능한 부분은 IEEE 작업 그룹 1003으로 넘겨져 1988년 POSIX 표준의 기초가 되었습니다. 1989년에 C 표준은 ANSI X3.159-1989 "Programming Language C"로 비준되었습니다. 이 언어 버전은 종종 ANSI C, Standard C 또는 때로는 C89로 불립니다.
1990년, 국제 표준화 기구(ISO)에 의해 (포맷 변경이 있는) ANSI C 표준이 ISO/IEC 9899:1990으로 채택되었으며, 이 표준은 때때로 C90이라고 불립니다. 따라서 "C89"와 "C90"이라는 용어는 동일한 프로그래밍 언어를 의미합니다.
ANSI는 다른 국가표준기구와 마찬가지로 더 이상 C 표준을 독자적으로 개발하지 않고, 실무그룹 ISO/IEC JTC1/SC22/WG14에 의해 유지되는 국제 C 표준을 의미합니다. 국제 표준에 대한 업데이트의 국가 채택은 일반적으로 ISO 출판 후 1년 이내에 이루어집니다.
C 표준화 프로세스의 목적 중 하나는 K&RC의 슈퍼셋을 생산하는 것이었고, 이후에 소개된 비공식적인 기능들 중 많은 것들을 통합했습니다. 또한 표준 위원회에는 기능 프로토타입(C++에서 차용)과 같은 몇 가지 추가 기능이 포함되었습니다. void
포인터, 국제 문자 집합 및 로케일에 대한 지원, 전처리기 향상. 매개변수 선언에 대한 구문이 C++에서 사용되는 스타일을 포함하도록 확장되었지만 기존 소스 코드와의 호환성을 위해 K&R 인터페이스는 계속 허용되었습니다.
C89는 현재의 C 컴파일러에서 지원하며, 대부분의 현대 C 코드는 이를 기반으로 합니다. 하드웨어 의존적 가정 없이 표준 C로만 작성된 모든 프로그램은 리소스 제한 내에서 적합한 C 구현을 가진 모든 플랫폼에서 올바르게 실행됩니다. 이러한 예방 조치가 없으면, 프로그램은 특정 플랫폼에서만 또는 특정 컴파일러와 함께 컴파일할 수 있습니다. 예를 들어 GUI 라이브러리와 같은 비표준 라이브러리의 사용 또는 정확한 데이터 유형 크기 및 바이트 엔디안니스와 같은 컴파일러 또는 플랫폼 고유 속성에 의존하기 때문입니다.
코드가 표준 적합 또는 K&R C 기반 컴파일러에 의해 컴파일 가능해야 하는 경우, __STDC__
매크로를 사용하여 코드를 Standard 섹션과 K&R 섹션으로 분할하여 Standard C에서만 사용할 수 있는 K&R 기반 컴파일러에서 사용할 수 없도록 할 수 있습니다.
ANSI/ISO 표준화 과정 이후 C 언어 규격은 몇 년 동안 비교적 정적인 상태로 유지되었습니다. 1995년, 일부 세부 사항을 수정하고 국제 문자 집합에 대한 보다 광범위한 지원을 추가하기 위해 1990 C 표준에 대한 규범 개정 1(ISO/IEC 9899/AMD1:1995, 비공식적으로 C95로 알려짐)이 발표되었습니다.[22]
C99
C 표준은 1990년대 후반에 추가로 개정되어 1999년에 ISO/IEC 9899:1999가 발표되었고, 이는 일반적으로 "C99"라고 불립니다. 이후 기술적인 코리젠다에 의해 세 번 수정되었습니다.[23]
C99는 인라인 기능을 포함한 몇 가지 새로운 기능과 여러 가지 새로운 데이터 유형을 소개했습니다. long long int
그리고 a. complex
type to represent complex number), 가변 길이 배열 및 유연 배열 부재, IEEE 754 부동 소수점 지원 개선, 가변 매크로(가변수 매크로) 지원, 다음으로 시작하는 한 줄 댓글 지원 //
, BCPL 또는 C++에서와 같이. 이들 중 상당수는 이미 여러 C 컴파일러에서 확장으로 구현되었습니다.
C99는 C90과 대부분의 하위 호환성을 위한 것이지만 어떤 면에서는 더 엄격합니다. 특히 형식 지정자가 없는 선언은 더 이상 사용할 수 없습니다. int
은연중에 가정한 표준 매크로 __STDC_VERSION__
값으로 정의됩니다. 199901L
C99 지원을 사용할 수 있음을 나타냅니다. GCC, Solaris Studio 및 기타 C 컴파일러는 이제[when?] C99의 많은 또는 모든 새로운 기능을 지원합니다. 그러나 마이크로소프트 비주얼 C++의 C 컴파일러는 C89 표준과 C99의 C++11과의 호환에 필요한 부분들을 구현합니다.[24][needs update]
또한 C99 표준에서는 탈출 문자 형태의 유니코드를 사용하는 식별자를 지원해야 합니다(예: \u0040
또는 \U0001f431
) 및 원시 유니코드 이름에 대한 지원을 제안합니다.
C11
2007년, 2011-12-08에 ISO/IEC 9899:2011이 공식 발표될 때까지 비공식적으로 "C1X"라고 불리는 C 표준의 또 다른 개정 작업이 시작되었습니다. C 표준 위원회는 기존 구현에서 테스트되지 않은 새로운 기능의 채택을 제한하는 지침을 채택했습니다.
C11 표준은 C와 라이브러리에 유형 일반 매크로, 익명 구조, 개선된 유니코드 지원, 원자 연산, 멀티 쓰레드, 경계 검사 기능 등 수많은 새로운 기능을 추가합니다. 또한 기존 C99 라이브러리의 일부 부분을 선택사항으로 만들고, C++와의 호환성을 향상시킵니다. 표준 매크로 __STDC_VERSION__
다음과 같이 정의됩니다. 201112L
C11 지원을 사용할 수 있음을 나타냅니다.
C17
2018년 6월 ISO/IEC 9899:2018로 출판된 C17은 현재 C 프로그래밍 언어의 표준입니다. 새로운 언어 기능은 도입하지 않고 기술적인 수정만 가능하며 C11의 결함에 대한 설명만 제공합니다. 표준 매크로 __STDC_VERSION__
다음과 같이 정의됩니다. 201710L
C17 지원을 사용할 수 있음을 나타냅니다.
C23
C23은 다음(C17 이후) 주요 C 언어 표준 개정판의 비공식 이름입니다. 대부분의 개발을 통해 비공식적으로 "C2X"로 알려졌습니다. C23은 ISO/IEC 9899:2024로 2024년 초에 발표될 예정입니다.[25] 표준 매크로 __STDC_VERSION__
다음과 같이 정의됩니다. 202311L
C23 지원을 사용할 수 있음을 나타냅니다.
C2Y
C2Y는 C23(C2X) 이후의 다음 주요 C 언어 표준 개정을 위한 임시 비공식 이름으로, "C2Y"에서 두 개에 따라 2020년대 후반에 출시될 것으로 예상됩니다. C2Y의 초기 작업 초안은 2024년 2월에 ISO/IEC JTC1/SC22/WG14에 의해 N3220으로 출시되었습니다.[26]
임베디드 C
역사적으로 임베디드 C 프로그래밍은 고정 소수점 연산, 여러 개의 개별 메모리 뱅크 및 기본 I/O 작업과 같은 이색적인 기능을 지원하기 위해 C 언어에 대한 비표준 확장이 필요합니다.
2008년 C 표준 위원회는 모든 구현이 준수해야 할 공통 표준을 제공함으로써 이러한 문제를 해결하기 위해 C 언어를[27] 확장한 기술 보고서를 발표했습니다. 고정 소수점 산술, 명명된 주소 공간, 기본 I/O 하드웨어 주소 지정 등 일반 C에서는 사용할 수 없는 여러 기능이 포함되어 있습니다.
구문
C는 C 표준에 의해 명시된 형식적인 문법을 가지고 있습니다.[28] 선 끝은 일반적으로 C에서 중요하지 않지만 선 경계는 전처리 단계에서 중요합니다. 구분 기호 사이에 주석이 표시될 수 있습니다. /*
그리고. */
, 또는 (C99 이후) 다음과 같습니다. //
줄이 끝날 때까지 구분된 주석 /*
그리고. */
중첩하지 마십시오. 이러한 문자 시퀀스는 문자열 또는 문자 리터럴 내부에 나타나는 경우 주석 구분 기호로 해석되지 않습니다.[29]
C 소스 파일에는 선언과 함수 정의가 포함되어 있습니다. 함수 정의에는 선언과 문장이 차례로 포함됩니다. 선언은 다음과 같은 키워드를 사용하여 새로운 유형을 정의합니다. struct
, union
,그리고. enum
, 또는 유형을 새 변수에 할당하거나 새 변수에 대한 저장소를 예약합니다. 일반적으로 유형 다음에 변수 이름을 적습니다. 다음과 같은 키워드 char
그리고. int
기본 제공 유형을 지정합니다. 코드 섹션은 괄호 안에 포함되어 있습니다({
그리고. }
, 선언의 범위를 제한하고 제어 구조에 대한 단일 문으로 작동하기 위해 "curly 괄호"라고 부르기도 합니다.
명령어로서 C는 명령문을 사용하여 작업을 지정합니다. 가장 일반적인 문장은 수식 문으로 평가할 수식과 세미콜론으로 구성되며, 평가의 부작용으로 함수가 호출되고 변수가 새로운 값이 할당될 수 있습니다. 명령문의 정상적인 순차 실행을 수정하기 위해 C는 예약된 키워드로 식별되는 여러 개의 제어 흐름 명령문을 제공합니다. 구조화된 프로그래밍은 다음에서 지원합니다. if
... [else
] 조건부 실행 및 다음에 의한 do
... while
, while
,그리고. for
반복 실행(looping). 그 for
문에는 별도의 초기화, 테스트 및 재초기화 식이 있으며, 이 중 일부 또는 전부를 생략할 수 있습니다. break
그리고. continue
루프 내에서 사용할 수 있습니다. 중단은 가장 안쪽의 엔클로저 루프 문을 떠나는 데 사용되며 계속은 초기화로 건너뛰기 위해 사용됩니다. 구조화되지 않은 것도 있습니다. goto
함수 내의 지정된 레이블로 직접 분기되는 문. switch
a를 선택합니다. case
정수식의 값을 기준으로 실행됩니다. 다른 많은 언어와 달리 제어 흐름은 다음 언어로 넘어갑니다. case
a에 의해 종료되지 않는 한 break
.
식은 다양한 내장 연산자를 사용할 수 있으며 함수 호출을 포함할 수 있습니다. 함수에 대한 인수와 대부분의 연산자에 대한 피연산자가 평가되는 순서는 지정되지 않습니다. 평가는 인터리빙될 수도 있습니다. 그러나 모든 부작용(변수에 대한 저장 포함)은 다음 "시퀀스 포인트" 이전에 발생합니다. 시퀀스 포인트에는 각 식 문의 끝과 각 함수 호출에 대한 입력 및 반환이 포함됩니다. 특정 연산자를 포함하는 식을 평가하는 동안에도 시퀀스 포인트가 발생합니다.&&
,
, ?:
쉼표 연산자). 이것은 컴파일러에 의한 높은 수준의 객체 코드 최적화를 허용하지만, C 프로그래머는 다른 프로그래밍 언어에 필요한 것보다 신뢰할 수 있는 결과를 얻기 위해 더 많은 주의를 기울여야 합니다.
케르니한과 리치는 "C 프로그래밍 언어의 서론"에서 다음과 같이 말합니다. "C는 다른 언어와 마찬가지로 결점이 있습니다. 연산자 중 일부는 잘못된 우선순위를 가지고 있습니다. 구문의 일부는 더 나을 수 있습니다."[30] C 표준은 이미 존재하는 소프트웨어에 대한 이러한 변경 사항의 영향 때문에 이러한 많은 결함을 수정하려고 시도하지 않았습니다.
문자 집합
기본 C 소스 문자 집합에는 다음 문자가 포함됩니다.
- ISO 기본 라틴 알파벳의 소문자 및 대문자:
a
–z
A
–Z
- 10진수:
0
–9
- 그래픽 문자:
! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { } ~
- 공백 문자: 공백, 가로 탭, 세로 탭, 폼 피드, 새 줄
새 줄은 텍스트 줄의 끝을 나타냅니다. 편의상 C가 텍스트 줄을 하나로 취급하지만 실제 단일 문자와 일치할 필요는 없습니다.
문자열 리터럴에는 추가적인 멀티바이트 인코딩 문자가 사용될 수 있지만 완전히 휴대가 가능한 것은 아닙니다. 최신 C 표준(C11)을 사용하면 다국적 유니코드 문자를 C 소스 텍스트 내에 휴대 가능하게 내장할 수 있습니다. \uXXXX
또는 \UXXXXXXXX
인코딩(여기서) X
16진수 문자)를 나타냅니다. 하지만 이 기능은 아직 널리 구현되지 않았습니다.
기본 C 실행 문자 집합에는 경고, 백스페이스 및 캐리지 반환에 대한 표현과 함께 동일한 문자가 포함됩니다. 확장 문자 집합에 대한 런타임 지원은 C 표준이 개정될 때마다 증가했습니다.
예약어
다음 예약된 단어는 대소문자를 구분합니다.
C89에는 키워드라고도 하는 32개의 예약 단어가 있습니다. 이 단어는 사전 정의된 단어 이외의 다른 용도로 사용할 수 없는 단어입니다.
C99는 다음과 같이 5개의 단어를 예약했습니다. (‡는 C23 키워드에 대한 대체 철자 별칭입니다.)
inline
restrict
_Bool
‡_Complex
_Imaginary
C11은 7개의 단어를 예약했습니다. (‡는 C23 키워드에 대한 대체 철자 별칭입니다.)
_Alignas
‡_Alignof
‡_Atomic
_Generic
_Noreturn
_Static_assert
‡_Thread_local
‡
C23은 15개의 단어를 더 예약했습니다.
alignas
alignof
bool
constexpr
false
nullptr
static_assert
thread_local
true
typeof
typeof_unqual
_BitInt
_Decimal32
_Decimal64
_Decimal128
최근 예약된 대부분의 단어는 밑줄 다음에 대문자로 시작합니다. 이전에는 해당 형식의 식별자가 구현에만 사용하도록 C 표준에 의해 예약되었기 때문입니다. 기존의 프로그램 소스 코드는 이러한 식별자를 사용해서는 안 되었기 때문에 C 구현이 프로그래밍 언어에 대한 이러한 확장을 지원하기 시작했을 때에는 영향을 받지 않습니다. 일부 표준 헤더는 강조 표시된 식별자에 대해 더 편리한 동의어를 정의합니다. 그 단어들 중 일부는 C23의 기존 철자로 키워드로 추가되었고 해당 매크로는 제거되었습니다.
C89 이전에는 entry
키워드로 예약했습니다. C89로 알려지게 된 것을 설명하는 그들의 책 The C Programming Language의 두 번째 판에서 Kernighan과 Ritchie는 다음과 같이 썼습니다. [keyword] entry
, 이전에는 예약되어 있었지만 사용되지 않은 사산은 더 이상 예약되어 있지 않습니다." 그리고 "사산은" entry
키워드가 철회되었습니다."[32]
연산자
C는 풍부한 연산자 집합을 지원합니다. 이 연산자는 식 내에서 해당 식을 평가하는 동안 수행할 조작을 지정하는 데 사용되는 기호입니다. C에는 다음을 위한 연산자가 있습니다.
- 산술: , , , ,
- 할당:
=
- 증강 할당:
+=
,-=
,*=
,/=
,%=
,&=
,=
,^=
,<<=
,>>=
- 비트 단위 논리:
~
,&
,^
- 비트 단위 이동:
<<
,>>
- 부울 논리:
!
,&&
, - 조건부 평가:
- 동등성 테스트: ,
- 호출 기능:
( )
- 증가 및 감소:
++
,--
- 구성원 선택:
.
,->
- 개체 크기:
sizeof
- 유형:
typeof
,typeof_unqual
C23이후로 - 주문 관계:
<
,<=
,>
,>=
- 참조 및 참조 해제:
&
,*
,[ ]
- 시퀀싱:
- 하위 표현 그룹화:
( )
- 유형 변환:
(typename)
C는 연산자를 사용합니다. =
(수학에서 등식을 표현하기 위해 사용됨) Fortran 및 PL/I의 선례를 따르지만 ALGOL 및 그 도함수와는 달리 할당을 표시합니다. C는 연산자를 사용합니다. ==
평등성을 시험하기 위해 이 두 연산자(할당 및 균등) 간의 유사성으로 인해 실수로 한 연산자가 다른 연산자 대신 사용될 수 있으며, 많은 경우 실수로 인해 오류 메시지가 표시되지 않습니다(일부 컴파일러에서 경고가 표시됨). 예를 들어, 조건식은 if (a == b + 1)
로 잘못 표기될 수도 있습니다. if (a = b + 1)
, 그것은 사실로 평가될 것입니다. a
할당 후 0이 아닙니다.[33]
C 연산자 우선 순위가 항상 직관적인 것은 아닙니다. 예를 들어 연산자는 ==
연산자보다 더 단단히 바인딩(이전에 실행됨) &
(비트와이즈 AND) 그리고
(bitwise OR) 다음과 같은 식으로 표시됩니다. x & 1 == 0
, 다음과 같이 적어야 하는 (x & 1) == 0
그것이 코더의 의도라면.[34]
"Hello, world" 예제
K&R 초판에 등장한 "안녕, 세상" 사례는 대부분의 프로그래밍 교과서에서 입문 프로그램의 모델이 되었습니다. 이 프로그램은 "안녕, 세상"을 표준 출력으로 출력하는데, 표준 출력은 일반적으로 단말기 또는 화면 디스플레이입니다.
원래 버전은 다음과 같습니다.[35]
주된() { 활자로 인쇄하다(안녕, 세상\n"); }
표준에 부합하는 "안녕, 세상" 프로그램은 다음과 같습니다.[a]
#include <stdio.h> 인트의 주된(공허한) { 활자로 인쇄하다(안녕, 세상\n"); }
프로그램의 첫 번째 행에는 다음과 같은 사전 처리 지침이 포함되어 있습니다. #include
. 이로 인해 컴파일러는 해당 행을 의 전체 텍스트로 대체합니다. stdio.h
다음과 같은 표준 입력 및 출력 함수에 대한 선언을 포함하는 표준 헤더 printf
그리고. scanf
. 주변의 각 브래킷 stdio.h
을 나타내다 stdio.h
일반적으로 로컬 또는 프로젝트별 헤더 파일을 포함하는 이중 따옴표와는 달리, 같은 이름의 다른 헤더보다 컴파일러와 함께 제공되는 헤더를 선호하는 검색 전략을 사용하여 찾을 수 있습니다.
다음 행은 이름이 지정된 함수임을 나타냅니다. main
정의 중입니다. 그 main
함수는 C 프로그램에서 특별한 목적을 수행합니다. 런타임 환경은 다음과 같습니다. main
프로그램 실행을 시작하는 함수입니다. 유형 지정자 int
다음을 평가한 결과 인보커에 반환되는 값(이 경우 런타임 환경)을 나타냅니다. main
함수, 는 정수입니다. 키워드. void
매개 변수 목록은 이 함수에 인수가 없음을 나타냅니다.[b]
시작되는 곱슬곱슬한 중괄호는 다음 정의의 시작을 나타냅니다. main
기능.
다음 줄은 이름이 지정된 함수를 호출(실행을 전환)합니다. printf
, 이 경우 시스템 라이브러리에서 제공됩니다. 이 통화에서, printf
함수는 단일 인수를 통해 전달(제공)되며 문자열 리터럴의 첫 번째 문자 주소입니다. "hello, world\n"
. 문자열 리터럴은 유형의 요소가 있는 이름이 지정되지 않은 배열입니다. char
, 배열의 끝을 표시하기 위해 컴파일러에 의해 최종 NULL(ASCII 값 0) 문자로 자동으로 설정됩니다. printf
줄의 길이를 알 수 있습니다.NULL 문자는 이스케이프 시퀀스로도 쓸 수 있으며, 다음과 같이 쓸 수 있습니다. \0
.그 \n
는 C가 새 줄 문자로 변환하는 이스케이프 시퀀스로, 출력 시 현재 줄의 끝을 나타냅니다. 의 반환 값. printf
기능은 유형입니다. int
, 하지만 그것은 사용되지 않기 때문에 소리 없이 버려집니다. (보다 신중한 프로그램은 반환 값을 테스트하여 다음의 여부를 결정할 수 있습니다. printf
함수가 성공하였습니다.) 세미콜론. ;
문을 종료합니다.
닫는 곱슬곱슬한 중괄호는 다음 코드의 끝을 나타냅니다. main
기능. C99 이상의 사양에 따르면, main
함수는 다른 함수와 달리 암묵적으로 다음 값을 반환합니다. 0
에 도달한 즉시 }
기능을 종료합니다. (이전에는 명시적입니다.) return 0;
진술이 필요했습니다.) 이는 런타임 시스템에 의해 성공적인 실행을 나타내는 종료 코드로 해석됩니다.[36]
데이터 유형
이 섹션은 확인을 위해 추가 인용이 필요합니다. 가 없는 수 있습니다.(2012년 10월) (이 를 에 대해 |
C의 타입 시스템은 정적이고 약하게 타이핑되어 있어 파스칼과 같은 ALGOL 후손의 타입 시스템과 유사합니다.[37] 다양한 크기의 정수에 대해 부호가 있는 경우와 부호가 없는 경우, 부동 소수점 번호, 열거된 경우 모두 내장된 유형이 있습니다.enum
). 정수형 char
는 종종 단일 바이트 문자에 사용됩니다. C99는 부울 데이터 유형을 추가했습니다. 배열, 포인터, 레코드를 포함한 파생 유형도 있습니다.struct
), 노조(union
).
C는 종종 유형 시스템에서 탈출이 필요할 수 있는 낮은 수준의 시스템 프로그래밍에서 사용됩니다. 컴파일러는 대부분의 표현식의 유형 정확성을 보장하려고 시도하지만 프로그래머는 한 유형에서 다른 유형으로 값을 명시적으로 변환하기 위해 유형 캐스트를 사용하거나 포인터 또는 결합을 사용하여 데이터 개체의 기본 비트를 다른 방식으로 재해석함으로써 다양한 방식으로 검사를 재정의할 수 있습니다.
어떤 사람들은 특히 함수 포인터의 경우 C의 선언 구문이 직관적이지 않다고 생각합니다. (Ritchie의 아이디어는 식별자의 사용과 유사한 맥락에서 식별자를 선언하는 것이었습니다: "선언은 사용을 반영합니다.")[38]
C의 일반적인 산술 변환을 사용하면 효율적인 코드를 생성할 수 있지만 때로는 예상치 못한 결과를 초래할 수 있습니다. 예를 들어, 동일한 너비의 서명된 정수와 서명되지 않은 정수를 비교하려면 서명된 값을 서명되지 않은 정수로 변환해야 합니다. 서명된 값이 음수인 경우 예기치 않은 결과가 발생할 수 있습니다.
포인터
C는 포인터 사용을 지원합니다. 포인터는 객체 또는 함수의 주소 또는 위치를 메모리에 기록하는 참조 유형입니다. 포인터는 가리키는 주소에 저장된 데이터에 액세스하거나 가리키는 함수를 호출하는 데 참조할 수 있습니다. 할당 또는 포인터 산술을 사용하여 포인터를 조작할 수 있습니다. 포인터 값의 런타임 표현은 일반적으로 원시 메모리 주소(아마도 단어 내 오프셋 필드로 보강됨)이지만 포인터의 유형에는 가리키는 것의 유형이 포함되므로 컴파일 시 포인터를 포함한 식을 유형 검사할 수 있습니다. 포인터 산술은 포인팅된 데이터 유형의 크기에 따라 자동으로 스케일링됩니다.
포인터는 C에서 여러 용도로 사용됩니다. 텍스트 문자열은 일반적으로 문자 배열에 포인터를 사용하여 조작됩니다. 동적 메모리 할당은 포인터를 사용하여 수행되며, 결과는 malloc
일반적으로 저장할 데이터 유형에 캐스트됩니다. 트리와 같은 많은 데이터 유형은 일반적으로 동적으로 할당된 것으로 구현됩니다. struct
포인터를 사용하여 서로 연결된 개체 다른 포인터에 대한 포인터는 종종 다차원 배열 및 배열에서 사용됩니다. struct
물건들. 함수에 대한 포인터(함수 포인터)는 함수를 상위 함수(예: qsort 또는 bsearch)에 인수로 전달하거나 디스패치 테이블에서 이벤트 핸들러에 콜백으로 전달하는 데 유용합니다.[36]
null 포인터 값은 유효한 위치가 없음을 명시적으로 가리킵니다. null 포인터 값을 참조하지 않으면 정의되지 않아 분할 오류가 발생하는 경우가 많습니다. Null 포인터 값은 링크된 목록의 마지막 노드에 "다음" 포인터가 없는 것과 같은 특수한 경우를 나타내거나 포인터를 반환하는 함수의 오류 표시에 유용합니다. 포인터 변수에 할당하는 것과 같은 소스 코드의 적절한 컨텍스트에서는 null 포인터 상수를 다음과 같이 쓸 수 있습니다. 0
, 포인터 유형에 대한 명시적인 캐스팅 유무에 관계없이 다음과 같은 NULL
여러 표준 헤더로 정의된 매크로 또는 상수가 있는 C23 이후 nullptr
. 조건부 컨텍스트에서 null 포인터 값은 false로 평가되고 다른 모든 포인터 값은 true로 평가됩니다.
공백 포인터(void *
)는 지정되지 않은 유형의 개체를 가리키므로 "generic" 데이터 포인터로 사용할 수 있습니다. 포인팅된 객체의 크기와 유형을 알 수 없기 때문에 보이드 포인터는 다른 객체 포인터 유형으로 쉽게 변환될 수 있지만(그리고 많은 컨텍스트에서 암묵적으로 변환될 수 있음), 보이드 포인터는 참조를 해제할 수 없으며 포인터 산술도 허용되지 않습니다.[36]
포인터를 부주의하게 사용하면 잠재적으로 위험합니다. 일반적으로 선택 해제되어 있기 때문에 포인터 변수가 임의의 위치를 가리킬 수 있으므로 바람직하지 않은 영향을 줄 수 있습니다. 적절하게 사용된 포인터가 안전한 곳을 가리키기는 하지만, 잘못된 포인터 산술을 사용하여 안전하지 않은 위치를 가리키도록 만들 수 있습니다. 이들이 가리키는 개체는 할당 해제(당글링 포인터) 후에도 계속 사용될 수 있습니다. 초기화(와일드 포인터) 없이 사용될 수도 있고, 캐스트, 유니언을 사용하거나 다른 손상된 포인터를 통해 안전하지 않은 값을 직접 할당받을 수도 있습니다. 일반적으로 C는 포인터 유형의 조작과 변환을 허용하지만 컴파일러는 일반적으로 다양한 수준의 검사 옵션을 제공합니다. 일부 다른 프로그래밍 언어는 더 제한적인 참조 유형을 사용하여 이러한 문제를 해결합니다.
배열
C의 어레이 유형은 일반적으로 컴파일 시 지정된 고정 정적 크기입니다. 더 최근의 C99 표준은 또한 가변 길이 배열의 형태를 허용합니다. 그러나 표준 라이브러리의 데이터를 사용하여 런타임에 (임의 크기의) 메모리 블록을 할당할 수도 있습니다. malloc
기능하고, 배열로 취급합니다.
어레이는 항상 포인터를 통해 액세스되기 때문에 (사실상) 어레이 액세스는 일반적으로 기본 어레이 크기에 대해 검사되지 않지만 일부 컴파일러는 경계 검사를 옵션으로 제공할 수 있습니다.[39][40] 따라서 배열 경계 위반이 가능하며 불법 메모리 액세스, 데이터 손상, 버퍼 오버런 및 런타임 예외를 포함하여 다양한 영향을 초래할 수 있습니다.
C는 다차원 배열을 선언하기 위한 특별한 규정을 두지 않고 오히려 유형 시스템 내의 재귀에 의존하여 배열을 선언함으로써 효과적으로 동일한 작업을 수행합니다. 결과적으로 생성된 "다차원 배열"의 인덱스 값은 행-주요 순서로 증가하는 것으로 간주될 수 있습니다. 다차원 배열은 일반적으로 행렬을 저장하기 위해 수치 알고리즘(주로 적용된 선형 대수)에 사용됩니다. C 어레이의 구조는 이 특정 작업에 매우 적합합니다. 그러나 C의 초기 버전에서는 배열의 경계가 고정된 값으로 알려져 있거나 그러한 경계를 필요로 하는 서브루틴에 명시적으로 전달되어야 하며 동적 크기의 배열은 이중 인덱싱을 사용하여 액세스할 수 없습니다. (이를 위한 해결책은 배열을 열에 대한 포인터의 추가 "행 벡터"로 할당하는 것이었습니다.) C99는 이 문제를 해결하는 "가변 길이 어레이"를 도입했습니다.
최신 C(C99 이상)를 사용하는 다음 예제는 힙에 2차원 어레이를 할당하고 액세스를 위해 다차원 어레이 인덱싱을 사용하는 것을 보여줍니다(많은 C 컴파일러에서 경계 검사를 사용할 수 있음).
인트의 펑크(인트의 N, 인트의 M) { 흘러가다 (*p)[N][M] = malloc(의 크기 *p); 한다면 (p == 0) 돌아가다 -1; 위해서 (인트의 i = 0; i < N; i++) 위해서 (인트의 j = 0; j < M; j++) (*p)[i][j] = i + j; 프린트_어레이(N, M, p); 공짜(p); 돌아가다 1; }
다음은 C99의 Auto VLA 기능을 사용한 유사한 구현입니다.[c]
인트의 펑크(인트의 N, 인트의 M) { // 주의: (플로트)의 N*M* 크기가 자동 VLA의 제한을 초과하지 않고 스택의 사용 가능한 크기 이내인지 확인해야 합니다. 흘러가다 p[N][M]; // 자동 VLA는 스택에 유지되며 함수가 호출될 때 크기가 조정됩니다. 위해서 (인트의 i = 0; i < N; i++) 위해서 (인트의 j = 0; j < M; j++) p[i][j] = i + j; 프린트_어레이(N, M, p); // 함수가 종료되면 나머지 스택 프레임과 함께 사라지기 때문에 free(p)할 필요가 없습니다. 돌아가다 1; }
어레이-포인트 상호 교환성
첨자 표기법 x[i]
(여기서) x
포인터를 지정합니다)는 다음을 위한 통사적 설탕입니다. *(x+i)
.[41]포인터 유형에 대한 컴파일러의 지식을 활용하여[41] 주소를 x + i
points to 는 기본 주소가 아닙니다(pointed to by). x
)에 의해 증가됨 i
바이트, 그러나 오히려 기본 주소가 증가하도록 정의됩니다. i
요소의 크기를 곱한 것. x
가리키다 따라서, x[i]
을 지정합니다. i+1
배열의 원소
또한, 대부분의 표현 문맥에서 (주목할 만한 예외는 다음과 같은 피연산자) sizeof
), 배열 유형의 식은 배열의 첫 번째 요소에 대한 포인터로 자동으로 변환됩니다. 이것은 배열이 함수에 대한 인수로 명명될 때 전체적으로 복사되지 않고 오히려 첫 번째 요소의 주소만 전달된다는 것을 의미합니다. 따라서 C의 함수 호출은 값별 전달 의미론을 사용하지만 실제로는 참조로 배열이 전달됩니다.
배열의 전체 크기 x
적용하여 결정할 수 있습니다. sizeof
배열 유형의 표현으로. 연산자를 적용하여 요소의 크기를 결정할 수 있습니다. sizeof
배열의 임의의 참조되지 않는 요소에 대해 A
, 에서와 같이 n = sizeof A[0]
. 따라서 선언된 배열의 요소 수 A
로 결정할 수 있습니다. sizeof A / sizeof A[0]
. 위에서 설명한 자동 변환 때문에 C 코드의 경우처럼 첫 번째 요소에 대한 포인터만 사용할 수 있는 경우 전체 유형의 배열과 배열 길이에 대한 정보가 손실됩니다.
메모리 관리
프로그래밍 언어의 가장 중요한 기능 중 하나는 메모리와 메모리에 저장된 객체를 관리하기 위한 기능을 제공하는 것입니다. C는 객체에 메모리를 할당하는 세 가지 주요 방법을 제공합니다.[36]
- 정적 메모리 할당: 객체에 대한 공간은 컴파일 시 바이너리에 제공되며, 이러한 객체는 포함된 바이너리가 메모리에 로드되는 한 범위(또는 수명)를 갖습니다.
- 자동 메모리 할당: 임시 개체를 스택에 저장할 수 있으며, 이 공간은 선언된 블록이 종료된 후 자동으로 해제되어 재사용할 수 있습니다.
- 동적 메모리 할당: 다음과 같은 라이브러리 기능을 사용하여 임의 크기의 메모리 블록을 런타임에 요청할 수 있습니다.
malloc
힙이라고 불리는 메모리 영역에서; 이러한 블록들은 라이브러리 함수를 호출함으로써 나중에 다시 사용할 수 있도록 해제될 때까지 지속됩니다.realloc
또는free
이 세 가지 접근 방식은 서로 다른 상황에서 적절하고 다양한 절충점을 가지고 있습니다. 예를 들어, 정적 메모리 할당은 할당 오버헤드가 거의 없고, 자동 할당은 약간 더 많은 오버헤드를 수반할 수 있으며, 동적 메모리 할당은 할당 및 할당 해제 모두에 대해 잠재적으로 많은 오버헤드를 가질 수 있습니다. 정적 개체의 지속적인 특성은 함수 호출 전반에 걸쳐 상태 정보를 유지하는 데 유용하며, 자동 할당은 사용하기 쉽지만 스택 공간은 일반적으로 정적 메모리 또는 힙 공간보다 훨씬 더 제한적이고 일시적입니다. 그리고 동적 메모리 할당을 통해 런타임에만 크기를 알 수 있는 개체를 편리하게 할당할 수 있습니다. 대부분의 C 프로그램은 세 가지를 모두 광범위하게 활용합니다.
컴파일러에 의해 스토리지가 관리되므로 프로그래머가 수동으로 스토리지를 할당하고 해제하는 오류가 발생하기 쉬운 작업에서 벗어날 수 있기 때문에 가능한 한 자동 또는 정적 할당이 일반적으로 가장 간단합니다. 그러나 많은 데이터 구조는 런타임에 크기가 변경될 수 있으며 정적 할당(및 C99 이전의 자동 할당)은 컴파일 시 고정된 크기를 가져야 하기 때문에 동적 할당이 필요한 상황이 많습니다.[36] C99 표준 이전에는 가변 크기 어레이가 일반적인 예였습니다. (관련 기사 참조) malloc
동적으로 할당된 어레이의 예입니다.) 제어되지 않는 결과로 실행 시 실패할 수 있는 자동 할당과 달리 동적 할당 함수는 필요한 저장소를 할당할 수 없을 때 표시(null 포인터 값의 형태)를 반환합니다. (너무 큰 정적 할당은 프로그램이 실행을 시작하기도 전에 일반적으로 링커 또는 로더에 의해 감지됩니다.)
달리 지정되지 않는 한 정적 개체는 프로그램 시작 시 0 또는 null 포인터 값을 포함합니다. 자동 및 동적으로 할당된 개체는 초기 값이 명시적으로 지정된 경우에만 초기화되며, 그렇지 않은 경우에는 초기에 불확정된 값을 갖습니다(일반적으로 스토리지에 존재하는 비트 패턴은 해당 유형에 대한 유효한 값을 나타내지 않을 수 있음). 프로그램이 초기화되지 않은 값에 액세스하려고 하면 결과가 정의되지 않습니다. 많은 최신 컴파일러가 이 문제를 감지하고 경고하려고 노력하지만 위양성과 위음성이 모두 발생할 수 있습니다.
힙 메모리 할당은 어느 프로그램에서나 실제 사용량과 동기화되어야 가능한 한 재사용할 수 있습니다. 예를 들어 힙 메모리 할당에 대한 유일한 포인터가 범위를 벗어나거나 명시적으로 할당 해제되기 전에 해당 값을 덮어쓰는 경우 나중에 다시 사용하기 위해 해당 메모리를 복구할 수 없으며 본질적으로 프로그램에 손실되는 현상을 메모리 누출이라고 합니다. 반대로 메모리가 해제되는 것은 가능하지만 이후에 참조되므로 예측할 수 없는 결과가 발생합니다. 일반적으로 오류가 발생하는 코드와 관련이 없는 프로그램의 일부에 오류 증상이 나타나므로 오류를 진단하기가 어렵습니다. 이러한 문제는 자동 쓰레기 수집으로 언어가 개선됩니다.
라이브러리
C 프로그래밍 언어는 라이브러리를 주요 확장 방법으로 사용합니다. C에서 라이브러리는 하나의 "아카이브" 파일에 포함된 기능 집합입니다. 각 라이브러리에는 일반적으로 프로그램에서 사용할 수 있는 라이브러리 내에 포함된 함수의 프로토타입과 이러한 함수와 함께 사용되는 특수 데이터 유형 및 매크로 기호 선언이 포함된 헤더 파일이 있습니다. 프로그램이 라이브러리를 사용하기 위해서는 라이브러리의 헤더 파일을 포함해야 하며, 라이브러리가 프로그램과 연결되어 있어야 하는데, 많은 경우 컴파일러 플래그(예: -lm
, link the math library)[36]의 줄임말.
가장 일반적인 C 라이브러리는 ISO 및 ANSI C 표준에 의해 지정되고 모든 C 구현과 함께 제공되는 C 표준 라이브러리입니다(내장 시스템과 같은 제한된 환경을 대상으로 하는 구현은 표준 라이브러리의 일부만 제공할 수 있음). 이 라이브러리는 스트림 입출력, 메모리 할당, 수학, 문자열 및 시간 값을 지원합니다. 여러 개의 개별 표준 헤더(예: stdio.h
) 이들 및 기타 표준 도서관 시설에 대한 인터페이스를 지정합니다.
또 다른 일반적인 C 라이브러리 함수 집합은 유닉스 및 유닉스 계열 시스템, 특히 커널에 대한 인터페이스를 제공하는 기능을 대상으로 하는 응용 프로그램에서 사용되는 것입니다. 이러한 기능은 POSIX, Single UNIX 규격 등 다양한 표준에 자세히 나와 있습니다.
많은 프로그램들이 C로 작성되었기 때문에, 사용할 수 있는 다양한 도서관들이 있습니다. 라이브러리는 C 컴파일러가 효율적인 객체 코드를 생성하기 때문에 C로 작성되는 경우가 많습니다. 그런 다음 프로그래머는 자바, 펄, 파이썬과 같은 상위 언어에서 루틴을 사용할 수 있도록 라이브러리에 대한 인터페이스를 만듭니다.[36]
파일 처리 및 스트림
파일 입력 및 출력(I/O)은 C 언어 자체의 일부가 아니라 라이브러리(예: C 표준 라이브러리)와 관련 헤더 파일(예:)에 의해 처리됩니다. stdio.h
). 파일 처리는 일반적으로 스트림을 통해 작동하는 높은 수준의 I/O를 통해 구현됩니다. 이러한 관점에서 스트림은 장치와 독립적인 데이터 흐름이고 파일은 구체적인 장치입니다. 높은 수준의 I/O는 스트림과 파일의 연결을 통해 수행됩니다. C 표준 라이브러리에서 버퍼(메모리 영역 또는 대기열)는 데이터가 최종 대상으로 전송되기 전에 데이터를 저장하는 데 일시적으로 사용됩니다. 따라서 하드 드라이브나 솔리드 스테이트 드라이브와 같은 더 느린 장치를 기다리는 데 걸리는 시간이 줄어듭니다. 낮은 수준의 I/O 기능은 표준 C 라이브러리의[clarification needed] 일부가 아니지만 일반적으로 "베어 메탈" 프로그래밍(대부분의 임베디드 프로그래밍과 같은 운영 체제에 독립적인 프로그래밍)의 일부입니다. 몇 가지 예외를 제외하고, 구현에는 낮은 수준의 I/O가 포함됩니다.
언어 도구
이 섹션은 확인을 위해 추가 인용이 필요합니다. (2014년 7월) (이 및 |
C 프로그래머가 컴파일러가 제공하는 것보다 더 엄격하게 정의되지 않은 행동이나 잘못된 표현을 가진 문장을 찾고 고칠 수 있도록 도와주는 많은 도구가 개발되었습니다. 공구 보푸라기가 처음이었고, 다른 많은 것들로 이어졌습니다.
자동화된 소스 코드 검사 및 감사는 모든 언어에서 유용하며, C개의 경우 린트와 같은 많은 도구가 존재합니다. 일반적인 방법은 프로그램이 처음 작성될 때 린트를 사용하여 의심스러운 코드를 탐지하는 것입니다. 프로그램이 린트를 통과하면 C 컴파일러를 사용하여 컴파일됩니다. 또한 많은 컴파일러가 실제로 오류일 가능성이 있는 구문적으로 유효한 구성에 대해 선택적으로 경고할 수 있습니다. MISRAC은 임베디드 시스템을 위해 개발된 그러한 의심스러운 코드를 피하기 위한 독점적인 지침 세트입니다.[42]
또한 어레이에 대한 경계 검사, 버퍼 오버플로 감지, 직렬화, 동적 메모리 추적 및 자동 가비지 수집과 같은 C의 표준 부분이 아닌 작업을 수행하기 위한 컴파일러, 라이브러리 및 운영 체제 수준 메커니즘이 있습니다.
Purify 또는 Valgrind와 같은 도구와 메모리 할당 기능의 특수 버전이 포함된 라이브러리와 연결하면 메모리 사용량의 런타임 오류를 파악하는 데 도움이 될 수 있습니다.[43][44]
사용하다
시스템 프로그래밍에서의 사용 근거
C는 운영 체제 및 임베디드 시스템 애플리케이션을 구현하는 시스템 프로그래밍에 널리 사용됩니다.[45] 이것은 다음과 같은 몇 가지 이유 때문입니다.
- C 언어를 사용하면 플랫폼 하드웨어와 메모리에 포인터와 유형 펀닝으로 액세스할 수 있으므로 시스템별 기능(예: 제어/상태 레지스터, I/O 레지스터)을 구성하고 C로 작성된 코드와 함께 사용할 수 있습니다. 이를 통해 실행 중인 플랫폼을 최대한 제어할 수 있습니다.
- 컴파일 후 생성된 코드는 많은 시스템 기능을 요구하지 않으며 일부 부트 코드에서 간단한 방식으로 호출할 수 있습니다. 실행이 간단합니다.
- 일반적으로 C 언어 문과 식은 대상 프로세서의 명령어 시퀀스에 잘 매핑되며, 결과적으로 시스템 리소스에 대한 런타임 요구량이 줄어 실행 속도가 빠릅니다.
- 풍부한 연산자 세트를 통해 C 언어는 대상 CPU의 많은 기능을 활용할 수 있습니다. 특정 CPU에 난해한 명령어가 더 많은 경우 언어 변형은 이러한 명령어를 이용하기 위해 고유 함수를 사용하여 구성할 수 있습니다. 이는 거의 모든 대상 CPU의 기능을 사용할 수 있습니다.
- 이 언어를 사용하면 이진 데이터 블록에 구조를 쉽게 오버레이하여 데이터를 이해하고 탐색하고 수정할 수 있으며, 데이터 구조, 심지어 파일 시스템도 작성할 수 있습니다.
- 이 언어는 정수 산술 및 논리, 그리고 아마도 다양한 크기의 부동 소수점 숫자를 위한 비트 조작을 포함한 풍부한 연산자 세트를 지원하며, 적절하게 구조화된 데이터를 효과적으로 처리할 수 있습니다.
- C는 매우 작은 언어로, 소수의 문장만 있고, 광범위한 대상 코드를 생성하는 기능이 너무 많지 않아 이해할 수 있습니다.
- C는 메모리 할당 및 할당 해제를 직접 제어하므로 메모리 처리 작업에 합리적인 효율성과 예측 가능한 타이밍을 제공하며, 산발적인 쓰레기 수집 이벤트에 대한 우려 없이 예측 가능한 성능을 제공합니다.
- C는 일반적인 메모리 할당 체계를 포함한 다양한 메모리 할당 체계의 사용 및 구현을 허용합니다.
malloc
그리고.free
; 영역이 있는 보다 정교한 메커니즘; 또는 DMA에 적합하거나 인터럽트 핸들러 내에서 사용하거나 가상 메모리 시스템과 통합할 수 있는 OS 커널용 버전. - 링커 및 환경에 따라 C 코드는 어셈블리 언어로 작성된 라이브러리를 호출할 수도 있으며 어셈블리 언어에서 호출할 수도 있습니다. 다른 하위 레벨 코드와 잘 상호 운용됩니다.
- C와 그 호출 규약 및 링커 구조는 일반적으로 다른 고급 언어와 함께 사용되며, C와 C로부터의 호출은 모두 지원되며, 다른 고급 코드와 잘 상호 운용됩니다.
- C는 라이브러리, 프레임워크, 오픈 소스 컴파일러, 디버거 및 유틸리티를 포함한 매우 성숙하고 광범위한 생태계를 갖추고 있으며 사실상의 표준입니다. 드라이버가 C에 이미 존재하거나 C 컴파일러의 백엔드와 유사한 CPU 아키텍처가 있기 때문에 다른 언어를 선택할 동기가 줄어들 수 있습니다.
웹 개발에 사용된 적이 있습니다.
역사적으로 C는 웹 애플리케이션, 서버 및 브라우저 간의 정보를 위한 "게이트웨이"로서 CGI(Common Gateway Interface)를 사용하여 웹 개발에 사용되기도 했습니다.[46] C는 속도, 안정성 및 거의 보편적인 가용성 때문에 해석된 언어보다 선택되었을 수 있습니다.[47] 웹 개발은 더 이상 C에서 이루어지는 것이 일반적인 관행이 아니며,[48] 다른 많은 웹 개발 도구가 존재합니다.
몇몇 다른 언어들은 그들 자신이 C로 쓰여져 있습니다.
C의 광범위한 가용성과 효율성의 결과는 다른 프로그래밍 언어의 컴파일러, 라이브러리 및 인터프리터가 C로 구현되는 경우가 많다는 것입니다.[49] 예를 들어 Python,[50] Perl,[51] Ruby [52]및 PHP의[53] 참조 구현은 C로 작성됩니다.
계산 집약적인 라이브러리에 사용됩니다.
하드웨어로부터의 추상화 계층이 얇고 오버헤드가 낮기 때문에 계산 집약적인 프로그램의 중요한 기준인 C는 프로그래머가 알고리즘 및 데이터 구조의 효율적인 구현을 가능하게 합니다. 예를 들어, GNU 다중 정밀 산술 라이브러리, GNU 과학 라이브러리, Mathematica 및 MATLAB은 완전히 또는 부분적으로 C로 작성됩니다. 많은 언어들이 C에서 라이브러리 함수를 호출하는 것을 지원합니다. 예를 들어, 파이썬 기반 프레임워크 NumPy는 고성능 및 하드웨어 상호 작용 측면에서 C를 사용합니다.
중급어로서의 C
C는 다른 언어의 구현에 의해 중간 언어로 사용되기도 합니다. 이 접근 방식은 휴대성이나 편의성을 위해 사용될 수 있습니다. 중간 언어로 C를 사용함으로써 추가적인 기계별 코드 생성기가 필요하지 않습니다. C에는 생성된 코드의 컴파일을 지원하는 행 번호 전처리 명령 및 이니셜라이저 목록 끝에 있는 옵션의 불필요한 쉼표와 같은 일부 기능이 있습니다. 하지만 C의 몇몇 단점들로 인해 C-와 같이 중간 언어로 사용하도록 특별히 설계된 다른 C 기반 언어들이 개발되었습니다. 또한 현대의 주요 컴파일러 GCC와 LLVM은 모두 C가 아닌 중간 표현을 특징으로 하며, 이러한 컴파일러들은 C를 포함한 많은 언어들의 프론트엔드를 지원합니다.
최종 사용자 애플리케이션
C는 또한 최종 사용자 애플리케이션을 구현하는 데 널리 사용되었습니다.[54] 그러나 이러한 응용 프로그램은 더 새로운 상위 언어로 작성할 수도 있습니다.
한계
집회언어의 힘과 집회언어의 편리성.
— Dennis Ritchie[55]
C는 인기가 많고 영향력이 있으며 크게 성공했지만 다음과 같은 단점이 있습니다.
- 표준 동적 메모리 처리 기능:
malloc
그리고.free
오류가 발생하기 쉽습니다. 버그는 다음을 포함합니다. 메모리가 할당되지만 해제되지 않을 때 메모리가 누출되고 이전에 해제된 메모리에 액세스할 수 있습니다. - 포인터의 사용과 메모리의 직접적인 조작은 프로그래머의 오류 또는 잘못된 데이터의 불충분한 확인 때문에 메모리의 손상이 가능하다는 것을 의미합니다.
- 형식 검사에는 약간의 형식 검사가 있지만, 변증법적 기능과 같은 영역에는 적용되지 않으며 형식 검사는 사소한 것이나 부주의로 회피될 수 있습니다. 약하게 타이핑되어 있습니다.
- 컴파일러에 의해 생성된 코드에는 체크 자체가 거의 포함되어 있지 않기 때문에 프로그래머는 버퍼 오버런, 어레이 경계 검사, 스택 오버플로, 메모리 소진 등으로부터 보호하고 레이스 조건, 스레드 분리 등을 고려해야 하는 부담이 있습니다.
- 포인터의 사용과 이러한 수단의 런타임 조작은 컴파일 시 결정할 수 없는 동일한 데이터(에일리어싱)에 액세스하는 두 가지 방법이 있을 수 있습니다. 이는 다른 언어에서 사용할 수 있는 일부 최적화가 C에서 불가능하다는 것을 의미합니다. FORTRAN은 더 빠른 것으로 간주됩니다.
- 예를 들어, 일부 표준 라이브러리 기능.
scanf
또는strncat
, 버퍼 오버런을 초래할 수 있습니다. - 생성된 코드에서 낮은 수준의 변형을 지원하는 데 제한된 표준화가 있습니다. 예를 들어, 서로 다른 함수 호출 규칙과 ABI, 서로 다른 구조 패킹 규칙, 더 큰 정수 내의 서로 다른 바이트 순서(엔디안니스 포함). 많은 언어 구현에서 이러한 옵션 중 일부는 전처리기 지침과 함께 처리될 수 있습니다.
#pragma
,[56]그리고[56][57] 일부는 추가 키워드가 있습니다. 예를 들어, 사용__cdecl
소집 규약 그러나 지침과 옵션은 일관되게 지원되지 않습니다.[58] - 표준 라이브러리를 사용한 문자열 처리는 코드 집약적이며 명시적인 메모리 관리가 필요합니다.
- 이 언어는 객체 지향, 내성, 런타임 표현 평가, 제네릭 등을 직접 지원하지 않습니다.
- 언어 기능의 부적절한 사용에 대한 보호자가 거의 없으며, 이로 인해 코드를 유지할 수 없게 될 수 있습니다. 특히 C 전처리기는 이중 평가와 더 나쁜 것과 같은 문제가 되는 효과를 숨길 수 있습니다.[59] 까다로운 코드를 위한 이 시설은 국제 난독화 C 코드 콘테스트와 언더핸드 C 콘테스트와 같은 대회로 축하를 받았습니다.
- C는 예외 처리에 대한 표준 지원이 부족하고 오류 검사에 대한 반환 코드만 제공합니다. 및
setjmp
표준 라이브러리 기능은 매크로를 통한 트라이 캐치 메커니즘을 구현하는 데 사용되었습니다[60].
일부 목적으로, 버그의 기회를 줄이기 위해 MISRAC 또는 CERTC와 같은 제한된 스타일의 C가 채택되었습니다. CWE와 같은 데이터베이스는 C 등이 취약점을 가지고 있는 방법과 완화를 위한 권장 사항을 계산하려고 시도합니다.
몇 가지 단점을 완화할 수 있는 도구가 있습니다. 컨템포러리 C 컴파일러에는 많은 잠재적 버그를 식별하는 데 도움이 되는 경고를 생성할 수 있는 체크가 포함되어 있습니다.
이러한 단점 중 일부는 다른 언어의 구축을 촉발했습니다.[citation needed]
관련 언어
C는 C++와 자바와 같은 많은 후기 언어에 직간접적인 영향을 미쳤습니다.[62] 가장 널리 퍼진 영향은 구문론적인 것이었습니다. 언급된 모든 언어는 C의 문 및 (다소 인지 가능하게) 표현 구문을 C의 형식 시스템, 데이터 모델 또는 대규모 프로그램 구조와 결합하고 때로는 급진적으로 결합합니다.
Ch 및 CNT를 포함하여 여러 C 또는 near-C 인터프리터가 존재하며, 이 인터프리터는 스크립팅에도 사용할 수 있습니다.
객체 지향 프로그래밍 언어가 인기를 끌었을 때, C++와 Objective-C는 객체 지향 기능을 제공하는 C의 서로 다른 두 가지 확장이었습니다. 두 언어 모두 원래 소스-투-소스 컴파일러로 구현되었으며 소스 코드는 C로 번역된 다음 C 컴파일러로 컴파일되었습니다.[63]
C++ 프로그래밍 언어(원래 이름은 "C with Classes")는 Bjarne Stroustrup이 C-like 구문으로 객체 지향 기능을 제공하기 위한 접근 방식으로 고안했습니다.[64] C++는 객체 지향 프로그래밍에서 유용한 더 큰 타이핑 강도, 범위 및 기타 도구를 추가하고 템플릿을 통한 일반 프로그래밍을 허용합니다. C의 거의 초집합인 C++는 이제[when?] 몇 가지 예외를 제외하고 대부분의 C를 지원합니다.
Objective-C는 원래 C 위에 매우 "씬한" 계층이었고 하이브리드 동적/정적 타이핑 패러다임을 사용하여 객체 지향 프로그래밍을 허용하는 엄격한 C의 상위 집합으로 남아 있습니다. Objective-C는 C와 Smalltalk에서 구문을 도출합니다. 전처리, 식, 함수 선언 및 함수 호출을 포함하는 구문은 C에서 상속되는 반면 개체 지향 기능에 대한 구문은 원래 Smalltalk에서 가져온 것입니다.
C++ 및 Objective-C 외에도 Ch, Cilk 및 Unified Parallel C는 거의 C의 초집합입니다.
참고 항목
메모들
- ^ 원래의 예제 코드는 엄격한 표준 준수 모드가 아닌 대부분의 최신 컴파일러에서 컴파일되지만 C89 또는 C99의 요구 사항을 완전히 준수하지는 않습니다. 실제로 C99는 진단 메시지를 생성해야 합니다.
- ^ 그
main
함수에는 실제로 두 가지 인수가 있습니다.int argc
그리고.char *argv[]
, 각각 명령줄 인수를 처리하는 데 사용할 수 있습니다. ISO C 표준(제5.1.2.2.1절)은 두 가지 형태의main
다른 어떤 기능에도 제공되지 않는 특별한 대우를 받는 것입니다. - ^ 코드:
print_array
(미도시) 약간의 차이도 있습니다.[why?]
참고문헌
- ^ a b Prinz, Peter; Crawford, Tony (December 16, 2005). C in a Nutshell. O'Reilly Media, Inc. p. 3. ISBN 9780596550714.
- ^ 리치(1993): "톰슨은 1972년 구조 이전에 초기 버전의 C로 코딩된 시스템을 제작하려고 잠시 시도했지만, 그 노력을 포기했습니다."
- ^ "C - Project status and milestones". ISO/IEC JTC1/SC22/WG14. Open Standards. April 5, 2023. Retrieved August 9, 2023.
- ^ Ritchie(1993): "C가 채택한 유형 구성 체계는 Algol 68에 상당한 빚을 지고 있지만, 아마도 Algol의 지지자들이 승인할 수 있는 형태로 나타나지는 않았습니다."
- ^ a b "Verilog HDL (and C)" (PDF). The Research School of Computer Science at the Australian National University. June 3, 2010. Archived from the original (PDF) on November 6, 2013. Retrieved August 19, 2013.
1980s: Verilog first introduced; Verilog inspired by the C programming language
- ^ "The name is based on, and pronounced like the letter C in the English alphabet". the c programming language sound. English Chinese Dictionary. Archived from the original on November 17, 2022. Retrieved November 17, 2022.
- ^ "C Language Drops to Lowest Popularity Rating". Developer.com. August 9, 2016. Archived from the original on August 22, 2022. Retrieved August 1, 2022.
- ^ a b c d e f 리치 (1993)
- ^ "Programming Language Popularity". 2009. Archived from the original on January 16, 2009. Retrieved January 16, 2009.
- ^ "TIOBE Programming Community Index". 2009. Archived from the original on May 4, 2009. Retrieved May 6, 2009.
- ^ Ward, Terry A. (August 1983). "Annotated C / A Bibliography of the C Language". Byte. p. 268. Retrieved January 31, 2015.
- ^ a b "History of C". en.cppreference.com. Archived from the original on May 29, 2018. Retrieved May 28, 2018.
- ^ "TIOBE Index for October 2021". Archived from the original on February 25, 2018. Retrieved October 7, 2021.
- ^ Ritchie, Dennis. "BCPL to B to C". Archived from the original on December 12, 2019. Retrieved September 10, 2019.
- ^ a b c d e Jensen, Richard (December 9, 2020). ""A damn stupid thing to do"—the origins of C". Ars Technica. Archived from the original on March 28, 2022. Retrieved March 28, 2022.
- ^ a b Johnson, S. C.; Ritchie, D. M. (1978). "Portability of C Programs and the UNIX System". Bell System Tech. J. 57 (6): 2021–2048. CiteSeerX 10.1.1.138.35. doi:10.1002/j.1538-7305.1978.tb02141.x. S2CID 17510065. (주: PDF는 원본을 OCR 스캔한 것이며, "IBM 370"을 "IBM 310"으로 렌더링한 것입니다.)
- ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. p. 10. 139. Archived (PDF) from the original on November 11, 2017. Retrieved February 1, 2015.
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (February 1978). The C Programming Language (1st ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110163-0.
- ^ [1]"C manual pages". FreeBSD Miscellaneous Information Manual (FreeBSD 13.0 ed.). May 30, 2011. Archived from the original on January 21, 2021. Retrieved January 15, 2021. 2021년 1월 21일 Wayback Machine에서 보관
- ^ Kernighan, Brian W.; Ritchie, Dennis M. (March 1988). The C Programming Language (2nd ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-110362-7.
- ^ Stroustrup, Bjarne (2002). Sibling rivalry: C and C++ (PDF) (Report). AT&T Labs. Archived (PDF) from the original on August 24, 2014. Retrieved April 14, 2014.
- ^ C Integrity. International Organization for Standardization. March 30, 1995. Archived from the original on July 25, 2018. Retrieved July 24, 2018.
- ^ "JTC1/SC22/WG14 – C". Home page. ISO/IEC. Archived from the original on February 12, 2018. Retrieved June 2, 2011.
- ^ Andrew Binstock (October 12, 2011). "Interview with Herb Sutter". Dr. Dobbs. Archived from the original on August 2, 2013. Retrieved September 7, 2013.
- ^ "WG14-N3132 : Revised C23 Schedule" (PDF). open-std.org. June 4, 2023. Archived (PDF) from the original on June 9, 2023.
- ^ "WG14-N3220 : Working Draft, C2y" (PDF). open-std.org. February 21, 2024. Archived (PDF) from the original on February 26, 2024.
- ^ "TR 18037: Embedded C" (PDF). ISO / IEC. Archived (PDF) from the original on February 25, 2021. Retrieved July 26, 2011.
- ^ Harbison, Samuel P.; Steele, Guy L. (2002). C: A Reference Manual (5th ed.). Englewood Cliffs, NJ: Prentice Hall. ISBN 978-0-13-089592-9. C에 대한 BNF 문법을 포함합니다.
- ^ Kernighan & Ritchie (1988), 페이지 192.
- ^ Kernighan & Ritchie (1978), 페이지 3.
- ^ "ISO/IEC 9899:201x (ISO C11) Committee Draft" (PDF). Archived (PDF) from the original on December 22, 2017. Retrieved September 16, 2011.
- ^ Kernighan & Ritchie (1988), pp. 192, 259.
- ^ "10 Common Programming Mistakes in C++". Cs.ucr.edu. Archived from the original on October 21, 2008. Retrieved June 26, 2009.
- ^ Schultz, Thomas (2004). C and the 8051 (3rd ed.). Otsego, MI: PageFree Publishing Inc. p. 20. ISBN 978-1-58961-237-2. Retrieved February 10, 2012.
- ^ Kernighan & Ritchie (1978), 페이지 6.
- ^ a b c d e f g Klemens, Ben (2013). 21st Century C. O'Reilly Media. ISBN 978-1-4493-2714-9.
- ^ Feuer, Alan R.; Gehani, Narain H. (March 1982). "Comparison of the Programming Languages C and Pascal". ACM Computing Surveys. 14 (1): 73–92. doi:10.1145/356869.356872. S2CID 3136859.
- ^ Kernighan & Ritchie (1988), p. 122.
- ^ 예를 들어, gcc는 _FORTIFY_SOUR를 제공합니다.
- ^ เอี่ยมสิริวงศ์, โอภาศ (2016). Programming with C. Bangkok, Thailand: SE-EDUCATION PUBLIC COMPANY LIMITED. pp. 225–230. ISBN 978-616-08-2740-4.
- ^ Raymond, Eric S. (October 11, 1996). The New Hacker's Dictionary (3rd ed.). MIT Press. p. 432. ISBN 978-0-262-68092-9. Retrieved August 5, 2012.
- ^ "Man Page for lint (freebsd Section 1)". unix.com. May 24, 2001. Retrieved July 15, 2014.
- ^ "CS107 Valgrind Memcheck". web.stanford.edu. Retrieved June 23, 2023.
- ^ Hastings, Reed; Joyce, Bob. "Purify: Fast Detection of Memory Leaks and Access Errors" (PDF). Pure Software Inc.: 9.
- ^ Dale, Nell B.; Weems, Chip (2014). Programming and problem solving with C++ (6th ed.). Burlington, Massachusetts: Jones & Bartlett Learning. ISBN 978-1449694289. OCLC 894992484.
- ^ Dr. Dobb's Sourcebook. U.S.: Miller Freeman, Inc. November–December 1995.
- ^ "Using C for CGI Programming". linuxjournal.com. March 1, 2005. Archived from the original on February 13, 2010. Retrieved January 4, 2010.
- ^ Perkins, Luc (September 17, 2013). "Web development in C: crazy? Or crazy like a fox?". Medium. Archived from the original on October 4, 2014. Retrieved April 8, 2022.
- ^ "C - the mother of all languages". ICT Academy at IITK. November 13, 2018. Archived from the original on May 31, 2021. Retrieved October 11, 2022.
- ^ "1. Extending Python with C or C++". Python 3.10.7 documentation. Archived from the original on November 5, 2012. Retrieved October 11, 2022.
- ^ Conrad, Michael (January 22, 2018). "An overview of the Perl 5 engine". Opensource.com. Archived from the original on May 26, 2022. Retrieved October 11, 2022.
- ^ "To Ruby From C and C++". Ruby Programming Language. Archived from the original on August 12, 2013. Retrieved October 11, 2022.
- ^ Para, Michael (August 3, 2022). "What is PHP? How to Write Your First PHP Program". freeCodeCamp. Archived from the original on August 4, 2022. Retrieved October 11, 2022.
- ^ Munoz, Daniel. "After All These Years, the World is Still Powered by C Programming". Toptal Engineering Blog. Retrieved November 17, 2023.
- ^ Metz, Cade. "Dennis Ritchie: The Shoulders Steve Jobs Stood On". Wired. Archived from the original on April 12, 2022. Retrieved April 19, 2022.
- ^ corob-msft (March 31, 2022). "Pragma directives and the __pragma and _Pragma keywords". Microsoft Learn. Archived from the original on September 24, 2022. Retrieved September 24, 2022.
- ^ "Pragmas (The C Preprocessor)". GCC, the GNU Compiler Collection. Archived from the original on June 17, 2002. Retrieved September 24, 2022.
- ^ "Pragmas". Intel® C++ Compiler Classic Developer Guide and Reference. Intel. Archived from the original on April 10, 2022. Retrieved April 10, 2022.
- ^ "In praise of the C preprocessor". apenwarr. August 13, 2007. Retrieved July 9, 2023.
- ^ Roberts, Eric S. (March 21, 1989). "Implementing Exceptions in C" (PDF). DEC Systems Research Center. SRC-RR-40. Archived (PDF) from the original on January 15, 2017. Retrieved January 4, 2022.
- ^ McMillan, Robert (August 1, 2013). "Is Java Losing Its Mojo?". Wired. Archived from the original on February 15, 2017. Retrieved March 5, 2017.
- ^ O'Regan, Gerard (September 24, 2015). Pillars of computing : a compendium of select, pivotal technology firms. Springer. ISBN 978-3319214641. OCLC 922324121.
- ^ Rauchwerger, Lawrence (2004). Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2-4, 2003 : revised papers. Springer. ISBN 978-3540246442. OCLC 57965544.
- ^ Stroustrup, Bjarne (1993). "A History of C++: 1979−1991" (PDF). Archived (PDF) from the original on February 2, 2019. Retrieved June 9, 2011.
원천
- Ritchie, Dennis M. (March 1993). "The Development of the C Language". ACM SIGPLAN Notices. ACM. 28 (3): 201–208. doi:10.1145/155360.155580.
- 저자의 제공으로, 또한
- Ritchie, Dennis M. (1993). "The Development of the C Language". The Second ACM SIGPLAN Conference on History of Programming Languages (HOPL-II). ACM. pp. 201–208. doi:10.1145/154766.155580. ISBN 0-89791-570-4. Retrieved November 4, 2014.
- Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language (2nd ed.). Prentice Hall. ISBN 0-13-110362-8.
추가읽기
- Plauger, P.J. (1992). The Standard C Library (1 ed.). Prentice Hall. ISBN 978-0131315099. (출처)
- Banahan, M.; Brady, D.; Doran, M. (1991). The C Book: Featuring the ANSI C Standard (2 ed.). Addison-Wesley. ISBN 978-0201544336. (무료)
- Harbison, Samuel; Steele, Guy Jr. (2002). C: A Reference Manual (5 ed.). Pearson. ISBN 978-0130895929. (archive)
- King, K.N. (2008). C Programming: A Modern Approach (2 ed.). W. W. Norton. ISBN 978-0393979503. (archive)
- Griffiths, David; Griffiths, Dawn (2012). Head First C (1 ed.). O'Reilly. ISBN 978-1449399917.
- Perry, Greg; Miller, Dean (2013). C Programming: Absolute Beginner's Guide (3 ed.). Que. ISBN 978-0789751980.
- Deitel, Paul; Deitel, Harvey (2015). C: How to Program (8 ed.). Pearson. ISBN 978-0133976892.
- Gustedt, Jens (2019). Modern C (2 ed.). Manning. ISBN 978-1617295812. (무료)
외부 링크
- ISO C 워킹그룹 공식 홈페이지
- ISO/IEC 9899, C99 근거를 포함한 공개된 공식 C 문서
- "C99 with Technical corrigenda TC1, TC2, and TC3 included" (PDF). Archived (PDF) from the original on October 25, 2007. (3.61MB)
- comp.lang.c 흔한 질문
- Dennis Ritchie의 A History of C
- C 라이브러리 참조 및 예제