C 언어의 문법

C 프로그램 언어의 문법은 소프트웨어 측면에서 다양하게 사용된다. C언어가 유닉스를 만들 때부터 사용하여 발전해 왔다. 그 동안 많은 발전을 거쳐 다양한 분야에서 사용한다.
전자공학에서 전자장치는 기본적으로 마이크로프로세서를 사용하는데, 거의 모든 소프트웨어는 C 언어를 사용한다. 기계어를 일부 사용하지만 아주 일부분만을 코딩하여 C언어와 결합 한다. 임베디드 분야에서 역시 중요하다. 리눅스 커널이 C언어로 작성되어 있으므로 이것의 포팅에서 필수 요소이다.
자료형 관련.
C/C++에서 취급하는 자료의 종류는 크게 정수형, 실수형으로 나누어 생각할 수 있다.
연산자.
종류와 기능.
산술 연산자.
codice_1     빼기
codice_2     더하기
codice_3     곱하기
codice_4     나누기
codice_5     나머지
codice_6    1 감소
codice_7    1 증가
codice_8  x만큼 감소.
codice_9  x만큼 증가.
codice_10  x만큼 곱해짐.
codice_11  x만큼 나뉨.
codice_12  x와 비트곱.
codice_13  x와 Exclusive OR 연산.
와 -- 연산자를 사용할 때, 언제 연산이 되는지 혼돈이 일어날 수 있.
 char num;
 char rnum;
 num = 3;
 rnum = num++ + num + 5;
 printf("num=%d, rnum=%d\n", num, rnum);
 rnum = num + 5 + --num;
 printf("num=%d, rnum=%d\n", num, rnum);
 if (num++)
 rnum = num + 5;
 printf("num=%d, rnum=%d\n", num, rnum);
실행결과:
 num=4, rnum=11: 3+3+5=11 이후 num++=&gt; 4
 num=3, rnum=11: --num =&gt; 3 이후 3+5+2=10
 num=4, rnum=9 : if 조건 처리후, num++=&gt;4 이후 4+5=9
관계 연산자.
codice_14   보다 큼
codice_15 보다 크거나 같음
codice_16  보다 작음
codice_17 보다 작거나 같음
codice_18 다름
codice_19 같음
우선순위.
우선 순위는 이미 위와 같이 C99 국제표준으로 정해져 있다. 그러나 개발자가 암기하는 것은 불편하다. 너무 복잡하기 때문이다. 이를 해결하는 방법은 우선 순위가 높은 (,), [, ]을 이용하여 지정하는 것이다.
 char chr;
 char idx = 0x5A;
 chr = 0x55;
 chr &amp;= idx | char &amp; 0xF1 | 0x33;
이렇게 코딩을 하면 &amp;와 | 가 혼재되어 의도한 데로 실행되지 않는 논리적 오류를 범할 수 있다.
 char chr;
 char idx = 0x5A;
 chr = 0x55;
 chr &amp;= [idx | (char &amp; 0xF1)] | 0x33;
우선 순위를 지정하면 개발자가 비교적 정확하게 표현할 수 있다.
전처리기 매크로.
매크로는 컴퍼일러에게 코드의 특성을 알려주는 키워드이다. 따라서 기계어로 컴파일 과정에서 필요한 요소이고, 매크로 자체가 기계어 코드로 생성 되지는 않지만 특정 코드를 제어하는데 사용한다.
자료형 (변수형).
실수형.
실수를 처리하기 위해 float와 double을 사용한다. 실수를 2진수를 표현할 때는 부동소수점(Float-Point) 방식을 사용한다. 이것은 국제표준 IEEE 754 규격에 따른다.
const.
const int iPI = 3;
const double dPI = 3.14159265;
const int num; // error C2734: 'num': const 개체는 extern이 아닌 경우 초기화될 수 있습니다.
const int count = 100;
int const sz = 10;
int main(int argc, char **argv)
 while (sz)
 sz--; // error C2105: '--'에 l-value가 필요합니다. - const 변수는 변경이 불가능
 while (count)
 count--; // error C2105: '--'에 l-value가 필요합니다. - const 변수는 변경이 불가능
 return 0;
enum과 #define.
특정 의미가 있는 숫자나 문자를 개발자가 이해가 쉬운 형태로 바꾸는 것이 define이다. 그러나 개발 단계에서 디버깅(debug) 과정에서 위의 정의 된 문자는 디버깅 테이블에서 제거되어 디버깅 단계에서 값이 어떤 값인지 알수가 없다. 정의 된 내용이 코드에 나오면, 바로 앞의 내용을 뒤에 정의 된 내용으로 바꾸어 치기 때문이다. 결국 컴파일 과정에서 기계어 코드에 이진수값을 넣는 방법으로 단순 대체 하는 것이다.
enum {
 ST_NULL = 0,
 ST_IN,
 ST_OUT,
 ERR_NULL = ST_NULL,
 ERR_READ = -1,
 ERR_WRITE = -2
enum은 define과 기능적으로 비슷 하지만 디버깅 단계에서 값을 확인 할 수 있다. 예를 들어 ERR_READ가 어떤 숫자 인지를 알 수 있다. 이것을 개발툴이 지원하려면 각 코드의 내용 중, 디버깅에 필요한 테이블에 등록하여 값 들을 저장하고 표시하는 것이다.
조건 판단.
프로그램에서 조건은 여러 가지 곳에서 사용한다. 조건문, 루프 등에서 조건을 판단한다. 조건은 최종적으로 참(true)과 거짓(false)로 결정한다.
조건의 사용 예 :
 int val;
 if (val)
 if (val &amp;&amp; val &gt;= 100)
 while (val)
그런데 조건은 참과 거짓 등으로 하나의 비트만 있으면 구별해서 표현할 수 있다. 그러나 C언어는 정수형에서 여러비트의 숫자가 존재하고 이것의 조건 판단도 가능하다.
조건 판단 기준 :
로 정의 한다.
 int val = 10;
 if (val) // val가 10 이므로 참
 val++;
 if (val &amp;&amp; val &gt;= 100) // val값이 11이므로 val는 참, 11 &gt;= 100이므로 거짓. 참 &amp;&amp; 거짓 하면 거짓
 val = 1;
 while (-1) // -1이 참이므로 무한 루프
 if (val &lt; 0)
 break;
블록.
블록은 프로그램 코드 중, 특정 영역을 지정하는데 사용한다.
함수에서 블록.
함수는 블록에 의해 함수의 코드 시작과 끝이 결정 된다. 따라서 함수의 시작을 위한 블록 '{'으로 시작하면, '}'으로 닫아야 한다.
블록의 예 :
int gResNum;
int add(int a, int b)
 return a+b;
int main(int argc, char *argv[], char**env)
 int sum; // 이 지역 변수는 함수 블록이 끝나면 없어진다.
 int num;
 if (argc &lt; 2)
 { // 조건문에서 다음 개의 함수를 실행한다. 2개의 함수 이므로 블록이 필요하다.
 printf("숫자 입력 : "); scanf("%d", &amp;num);
 else
 num = atoi(argv[1]);
 { // 임의로 블록을 만든다.
 int sum = 0; // 블록 내에서 선언 된 변수는 지역변수(자동변수)로 이 블록이 끝나면 없어진다.
 for (int cnt = 0;cnt &lt; num;cnt++)
 sum += cnt;
 printf("1 ~ %d 합 = %d\n", num, sum);
 gResNum = sum;
 } // 임의의 블록 끝.
 sum = add(num, 100);
 printf("%d에 100을 더하면 %d.\n", num, sum);
 return 0;
흐름 제어.
프로그램 코드의 실행은 나열된 순서로 진행한다. 조건에 따라 실행 위치를 결정하기 조건적 실행 코드를 만들 수 있다.
조건 실행: if ~ else.
 if (조건)
 // 조건이 참일 때 실행
 else
 // 조건이 거짓일 때 실행
void 변수.
void는 자료형이 존재하지 않음을 나타내는 형식 지정자이다. 계산이나 값 저장 목적으로는 쓰이지 않으며 사용도 불가능하다. 하지만 void 형 포인터는 그 어떤 자료형도 가리키지 않으므로 다목적 포인터 변수로 사용이 가능하다.