일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- NET bible
- 리눅스
- xiphos
- 회중찬양
- 우분투
- noti
- 시포스
- 파이썬
- crosswire
- 주를 기뻐하라
- 오픈소스
- 이메일 노티
- 게시판 감시
- 크로스와이어
- sh
- 사진
- 주를기뻐하라
- Bash
- 아이폰
- 하늘
- sword project
- 스크립트
- 쉘스크립트
- 파이선
- 성경 주해
- 소드 프로젝트
- 쉘
- Python
- 성서 주석
- STEP bible
- Today
- Total
저 세상밖으로...
문장(Statement), 수식(expression), 연산자(operator) 본문
:: 문장(statement) ::
- 선행 처리기 지시어(#include, #define)를 제외하고는 항상 세미콜론 (;)으로 끝난다.
- C언어 컴파일러는 모든 공백을 무시한다.
- 문자열 상수 "" 내에서의 공백은 컴파일러가 그대로 받아들인다.
- 문자열 내 줄 구분을 사용하기 위해서는 그 앞에 백슬러시(\)를 포함시켜야 한다.
printf("hello, \ world");
{ printf("Hello, "); printf("world"); }
:: 수식(expression) ::
1.25 / 8 + 5 * rate + rate * rate / cost
수식 내에 여러 개의 연삭자가 사용될 때는 연산자의 우선순위에 의해서 결과가 계산된다.
다음과 같이 문장을 작성할 수도 있다.
y = x = a + 10;
a + 10 을 x에 넣고 이 x를 y에 넣는다.
x = 6 + ( y = 4 + 5);
4 + 5 의 값을 y에 넣는다. 이에 6을 더하여 x에 넣는다.
:: 연산자(operator) ::
C에서 모든 연산항은 수식이다. C의 연산자에는 여러 가지 종류가 있다.
- 할당 연산자(assignment operator)
- 산술 연산자(mathematical operator)
- 관계 연산자(relational operator)
- 논리 연산자(logical operator)
x = y;
산술연산자는 덧셈이나 뺄셈고 같은 수학적 연산을 수행한다.
단항 산술 연산자
++x, x++ : 연산항을 1 증가시킨다.
--y, y-- : 연산항을 1 감소시킨다.
++x; --y;
이는
x = x + 1; y = y - 1 ;
이와 같다.
단항 연상자는 연상 앞에서 사용되는 선행모드(prefix mode)와, 연산항 뒤에 사용되는 후행모드(postfix mode)가 있다. 이 둘에 대한 차이는 다음 소스가 결과를 잘 보여준다.
/* 단항 연산자의 선행과 후행 모드 */ #include <stdio.h> int a, b; main() { /* a와 b에 5를 할당 */ a = b = 5; /* a와 b를 감소시키며 출력 */ /* b를 선행글쓰기...모드(prefix mode), a를 후행모드(postfix mode) 적용 */ printf("%d %d\n", a--, --b); printf("%d %d\n", a--, --b); printf("%d %d\n", a--, --b); printf("%d %d\n", a--, --b); printf("%d %d\n", a--, --b); return 0; }
결과는
5 4
4 3
3 2
2 1
1 0
이다.
이항 산술 연상자
C언어에는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 외에 나머지(%)가 있다. 첫 번째 연산항을 두번째 연상항으로 나누고 생성되는 나머지 값을 돌려주는 것이다.
100 % 9 -> 1
10 % 5 -> 0
40 % 6 -> 4
다음은 초 단위로 표현되는 값을 시간, 분, 초로 변환시키는 예제이다.
/* 나머지 연산자 사용의 예 초 단위 값을 입력하면 시, 분, 초로 계산한다. */ #include <stdio.h> /* 상수 정의 */ #define SECS_PER_MIN 60 #define SECS_PRE_HOUR 3600 unsigned seconds, minutes, hours, secs_left, mins_left; main() { /* 초단위 값 입력 */ printf("Enter number of seconds( < 65000: \n"); scanf("%d", &seconds); hours = seconds / SECS_PRE_HOUR; minutes = seconds / SECS_PER_MIN; mins_left = minutes % SECS_PER_MIN; secs_left = seconds % SECS_PER_MIN; printf("%u seconds is equeal to ", seconds); printf("%u h, %u m, and %u s\n", hours, mins_left, secs_left); return 0; }
연산자 우선순위 : [ ++ , -- ] → [ *, / , % ] → [ + , - ]
- 왼쪽부터 우선적으로 진행 (ex. 5 * 3 + 1 : 5에서 3을 곱한 뒤 1을 더한다. 수학과 동일)
- 동등한 레벨의 연산자의 경우 왼쪽에섭터 진행 (ex. 5 * 3 % 2 : 5에서 3을 곱한 값에서 2로 나눈 나머지를 구한다)
- 우선순위를 지정하고 싶을 경우 괄호()를 사용하면 된다. (ex. 5 * (3 + 1) : 3과 1을 더한 값에 5를 곱한다) * 중첩괄호 사용가능
a = ( 5 == 5 )
a = ( 5 != 5 )
a = ( 12 == 12) + ( 5 ! = 1 )
만약 다음과 같은 내용을 사용한다면
x == y > z
이는 다음과 같은 뜻이 된다.
x == ( y > z )
이 식에서는 먼저 y가 z보다 큰 것이 '참'인지를 확인할 것이다. 이를 통해 얻게 된 참(1) 혹은 거짓(0)의 값이 x와 동일한지를 확인할 것이다.
논리 연산자
논리 연산자의 종류: and (&&), or (||), not(!)
exp1 && exp2 : exp1과 exp2가 모두 참이라야 참(1)이 된다.
exp1 || exp2 : 둘 중 하나만 참이면 참(1)이다.
!exp1 : exp1가 참이면 거짓(0), 거짓이면 참(1)이 된다.
#include <stdio.h> main() { printf("%d\n", (1 == 1) && (0 == 0)); printf("%d\n", (1 == 1) || (1 == 0)); printf("%d\n", (1 == 1) && (0 != 0)); printf("%d\n", ! (0 != 0)); }
결과는 1, 1, 0, 1 이다.
논리 연산자를 여러개로 구성할 수도 있다.
(x == 2) || (x == 3) || (x == 4)
if 연산은 0이 아니면 무조건 참이다. 가령
x = 3; if (x) printf("%d", x);
하게 될 경우, x는 0이 아니므로 if구문은 참으로 인식한다. 그러므로 if (x)는 if (x != 0) 을 의미한다.
논리 연산자의 우선순위: [ ! → ++ , -- ... ] → [ ==, >=, <= ] → [ && ] → [ || ]
때문에 명확한 논리연산 순서 지정을 위해서는 괄호가 필요할 때가 있다. 다음 소스는 서로의 값이 각각 1과 0으로 다르게 나타난다.
#include <stdio.h> /* 변수를 초기화한다. c는 d보다 작지 않은데, 이런 조건을 확인할 것이다. 그래서 전체 수식은 거짓으로 평가된다. */ int a = 5, b = 6, c = 5, d = 1; int x; main() { /* 괄호 없이 수식을 평가 */ x = a < b || a < c && c < d; printf("%d\n", x); /* 괄호로 수식을 평가 */ x = ( a < b || a < c ) && c < d; printf("%d\n", x); return 0; }
다음 표식은
x = x + 5;
다음과 같이 간략히 표시할 수도 있다(이는 파이썬에서도 쓰이는 방법이다).
x += 5;
이런식으로 사용하는 것을 복합 할당 연산자라고 부른다. C언어에서는 다음과 같이 복합 할당 연산자를 사용할 수 있다.
x *= 1 -> x = x * y
y -= z + 1 -> y = y - z + 1
a /= b -> a = a / b
y += y / 8 -> x = x + y / 8
y %= 3 -> y = y % 3
조건 연산자
x = y ? 1 : 100 ;
y가 참(0이 아닐경우)일 경우 x에 1을 할당하고, 거짓(0)일 경우 x에 100을 할당한다. 같은 방법으로
z = ( x > y ) ? x : y ;
x와 y중 큰 값을 z에 할당하는 식이 가능하다. 이는 다음과 같은 if구문으로 표현할 수 있다.
if (x > y ) z = x ; else z = y ;
하지만 조건 연산자는 printf() 함수의 내부와 같이 if문을 사용할 수 없는 곳에서도 사용할 수 있다.
printf("The larger value is %d", ( x > y ) ? x : y );
쉼표 연산자
이는 C에서 변수 선언, 함수의 인수 등을 독립적으로 구분하기 위해 사용한다.
x = (a++, b++) ;
연산자 우선순위
() {} -> . ! ~ ++ *(간접연산자) &(주소 연산자) sizeof +(단항 연산자) -(단항연산자) *(곱셈연산자) / % + - << >> < <= > >= == != &(비트 AND 연산자) ^ | && :: ?: = += =+ *= /+ %= &= ^= |= <<= >>= .
[참고문헌]
- Teach Yourself C
'프로그래밍 > C언어' 카테고리의 다른 글
함수(function) (0) | 2016.05.07 |
---|---|
변수 (0) | 2016.05.06 |