[사이클론 C언어 강의] 기초 프로그래밍 2 (1-2-3)
1. 변수
C 언어에서는 데이터를 저장하기 위하여 변수를 선언합니다. C 언어에서 변수(variable)라는 것은 특정 데이터를 저장할 때 쓰이는 특정 메모리 공간의 이름입니다. 다음의 예제를 보면서 변수에 대하여 더 자세히 알아보도록 합시다.
여러분은 5~6번째 줄을 유심히 지켜볼 필요가 있습니다. 앞의int는 자료형을 의미하며 뒤의 name은 변수 이름입니다. 그리고 6번째줄은 변수 이름에 10의 값을 대입한다는 뜻입니다.
변수를 선언할때에는 한가지 주의 사항이 있습니다. 변수의 이름에 대해서는 프로그래머가 임의로 지정할 수 있지만, 변수 이름 선언 방식에는 몇가지의 규칙이 있습니다.
첫째. 변수의 이름은 알파벳과 숫자와 언더바( _ )를 제외한 어떠한 문자로는 정의될 수 없습니다.
둘째. 변수의 이름은 숫자로 시작할 수 없습니다.
셋째. 변수의 이름은 키워드를 사용할 수 없습니다. (키워드에 대해서는 아래 표를 참조해 주세요.)
넷째. 변수의 이름은 대소문자를 구분합니다. 즉 name 과 NAME 은 전혀 다른 변수 이름이 돼 버립니다.
다섯째. 변수의 이름에 공백이 포함되어선 안됩니다.
(표 1-1 : C15기준 표준 키워드)
double |
auto |
struct |
int |
break |
while |
static |
if |
do |
volatile |
sizeof |
goto |
default |
void |
signed |
for |
continue |
unsigned |
short |
float |
const |
union |
return |
extern |
char |
typedef |
register |
else |
enum |
case |
switch |
long |
자, 그럼 아래의 예제를 보면서 변수에 대해서 좀 더 자세히 알아보도록 합시다.
변수는 선언과 동시에 초기화가 가능하며, 동시에 여러개의 변수를 선언할 수도 있습니다. 그리고 printf를 통해 변수의 값을 출력할 수도 있습니다.
2. 연산자
C언어 에서는 다양한 연산자들이 존재합니다. 연산자라는 것은 말 그대로 계산을 위한것입니다. 다음의 예제를 봅시다.
여기서 사용된 (+)연산자와 같은것들을 산술 연산자라고 하며, (=)과 같은 연산자를 대입 연산자라고 합니다. 또한, 이러한 연산식은 이항 연산자라고 합니다. 다음의 표를 보고 기본적인 연산자에 대하여 알아보도록 합시다.
(표 1-2 : 다양한 연산자들)
연산자 |
의미 |
결합성 |
= |
오른쪽의 값을 왼쪽에 대입 예) a=10 |
오른쪽에서 왼쪽 |
+ |
값을 더함 예) a+b+c |
왼쪽에서 오른쪽 |
- |
값을 뺌 예) a-b |
왼쪽에서 오른쪽 |
* |
값을 곱함 예) a*b*2 |
왼쪽에서 오른쪽 |
/ |
값을 나눔 예) b/a |
왼쪽에서 오른쪽 |
% |
값을 나눈 다음 나머지를 반환 예) a%b |
왼쪽에서 오른쪽 |
여기서 결합성이라는 것은 뒤에 설명하도록 하고, 다음의 예제를 보면서 좀 더 상세히 알아보도록 하겠습니다.
여기서 우리가 유심히 지켜볼것은 나눗셈입니다. 20에서 11을 나눴는데 결과가 1이 나오는 이유는 int 자료형에서는 오직 정수만 표현하기 때문에 나머지를 버리기 때문입니다. 이는 자료 구조론에서 좀 더 상세히 알려드리겠습니다.
다음은 대입 연산자에 대하여 좀 더 상세히 설명드리고자 합니다. 대입 연산자에서는 =을 비롯하여 +=, -=, *=, /=, %=이 있습니다. 이는 다음과 같은것을 의미합니다.
(표 1-3 : 기타 대입 연산자들)
a = a + b; |
→ |
a += b; |
a = a - b; |
→ |
a -= b; |
a = a * b; |
→ |
a *= b; |
a = a / b; |
→ |
a /= b; |
a = a % b; |
→ |
a %= b; |
위의 식은 변수 a에 a와 b를 계산하여 나온 값을 다시 a에 집어 넣는다는 뜻입니다. 그리고 왼쪽에 있는 식과 오른쪽에 있는 식은 서로 동일한 식이며 각각의 대입 연산자들은 식을 짧게 줄여 코딩을 짧게할 수 있다는 장점이 있습니다.
다음은 증가, 감소 연산자에 대하여 알아보도록 하겠습니다.
(표 1-4 : 증가, 감소 연산자들)
연산자 |
의미 |
결합성 |
++a |
값을 1 증가후 연산 진행 예) printf("%d", ++a); |
왼쪽에서 오른쪽 |
a++ |
연산을 진행한 후 값을 1 증가 예) printf("%d", a++); |
왼쪽에서 오른쪽 |
--a |
값을 1 감소후 연산 진행 예) printf("%d", --a); |
왼쪽에서 오른쪽 |
a-- |
연산을 진행한 후 값을 1 감소 예) printf("%d", a--); |
왼쪽에서 오른쪽 |
이는 다음의 예제를 확인해 봅시다.
컴파일 결과 :
선 증가, 후 연산 11
선 연산, 후 증가 20
변수 b의 값 다시 확인 21
이와 같이 ++a는 증가를 먼저 한 뒤에 연산을 하며, b++는 연산을 먼저 한 뒤에 연산을 진행하였습니다.
그럼 다음과 같은 연산은 어떻게 진행이 될 까요?
답은 14입니다. 왜 이런 결과가 나오는지는 독자 여러분께서 직접 생각해 보시는 것도 나쁘지 않는 방법이라 생각합니다.
다음은 관계 연산자에 대하여 알아보도록 하겠습니다.
(표 1-5 : 관계 연산자들)
연산자 |
의미 |
결합성 |
< |
예) a<b a가 b보다 작은가? |
왼쪽에서 오른쪽 |
> |
예) a>b a가 b보다 큰가? |
왼쪽에서 오른쪽 |
<= |
예) a<b a가 b보다 같거나 작은가? |
왼쪽에서 오른쪽 |
>= |
예) a>b a가 b보다 같거나 큰가? |
왼쪽에서 오른쪽 |
== |
예) a==b a와 b가 같은가? |
왼쪽에서 오른쪽 |
!= |
예) a!=b a와 b가 다른가? |
왼쪽에서 오른쪽 |
관계 연산자들은 두 변수의 관계가 참(true)이면 1을 반환하며, 거짓(false)이면 0을 반환합니다.
다음의 예제를 살펴보도록 합시다.
이와 같이 컴파일을 진행하면 결과가 참인 값은 1로, 거짓인 값은 0으로 반환하여 출력이 될 것입니다.
다음은 논리 연산자에 대하여 알아보도록 하겠습니다.
(표 1-5 : 논리 연산자들)
연산자 |
의미 |
결합성 |
&& |
예) a && b 두 피연산자가 모두 참이면 true를 반환 (and의 의미) |
왼쪽에서 오른쪽 |
|| |
예) a || b 두 피연산자중 하나라도 참이면 true를 반환 (or의 의미) |
왼쪽에서 오른쪽 |
! |
예) !a 피연산자가 참이면 거짓을, 거짓이면 참을 반환 (not의 의미) |
오른쪽에서 왼쪽 |
다음의 예제를 살펴보도록 합시다.
컴파일 결과 :
val4의 값 0
val5의 값 1
val6의 값 0
이와 같이 결과가 참(true)이면 1을, 거짓(false)이면 0을 반환하게 된다.
다음은 콤마연산자에 대하여 설명드리도록 하겠습니다. 콤마 연산자는 둘 이상의 변수를 동시에 선언하거나, 순서대로 실행될 여러 문장들을 한 줄에 선언할 때에도 사용됩니다. 다음과 같은 예제를 참고합시다.
컴파일 결과 :
1 3 20 77
4 -51
안녕 하세요
우리는 연산자에 대하여 학습했습니다. 하지만 이러한 연산자들이 복잡한 식으로 표현될 때는 어떻게 될까요? 복잡한 연산식의 순서가 서로 뒤섞여서 프로그래머가 원하는 결과가 제대로 안나올까요? '정답은 프로그래머가 원하는 결과가 제대로 나온다.' 입니다. C언어는 이러한 결과를 예상하고, 연산자들의 우선순위를 정해놓았습니다. 다음의 표를 참고하도록 하겠습니다.
연산 순위 |
연산자 |
결합성 |
1 |
(), [], ->, . |
왼쪽에서 오른쪽 |
2 |
sizoof, &, ++, --, ~, !, *(역참조, 지정 연산자), +(단항 연산자), -(단항 연산자) |
오른쪽에서 왼쪽 |
3 |
*(곱셈 연산자), /, % |
왼쪽에서 오른쪽 |
4 |
+(이항 연산자), -(이항 연산자) |
왼쪽에서 오른쪽 |
5 |
<<, >> |
왼쪽에서 오른쪽 |
6 |
<, >, <=, >= |
왼쪽에서 오른쪽 |
7 |
==, != |
왼쪽에서 오른쪽 |
8 |
& |
왼쪽에서 오른쪽 |
9 |
^ |
왼쪽에서 오른쪽 |
10 |
| |
왼쪽에서 오른쪽 |
11 |
&& |
왼쪽에서 오른쪽 |
12 |
|| |
왼쪽에서 오른쪽 |
13 |
?: |
오른쪽에서 왼쪽 |
14 |
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= |
오른쪽에서 왼쪽 |
15 |
, |
왼쪽에서 오른쪽 |
아무리 우선순위가 정해져 있다고 하여도, 우선순위가 같은식이 둘 이상 포함이 된다면 어떻게 될까요? 이것의 해답은 바로 '결합성'에 있습니다. 우선순위가 같은 식이 둘 이상 놓였을때는 결합성을 따집니다. 예를 들어 결합성이 왼쪽에서 오른쪽인 +, - 등의 계산은 왼쪽에서 오른쪽으로 순서대로 계산을 하게 됩니다. 이는 1+2+3-4를 순서대로 계산하는 과정과 같습니다.
위와 같은 표에서는 여지껏 우리가 보지 못했던 연산자들이 있습니다. 이들은 지금 설명하기엔 어려움이 있으므로 차차 설명하도록 하겠습니다.
3. 입력함수
우리는 여지껏 출력 함수만 사용했었습니다. 출력을 하는 함수가 있으면 입력을 받는 함수도 있습니다. 이 함수의 이름은 바로 scanf이며 다음의 예제 보며 사용방법을 알려드리도록 하겠습니다.
이와 같이 scanf는 유저로부터 입력된 값을 변수에 저장하는 역할을 합니다. 또한 위의 코드는 다음과 같이 작성해도 무관합니다.
이상으로 1장 강의 내용을 마칩니다.
2장부터는 자료구조 개론에 관하여 강의할 예정입니다.
학습내용) 우리는 변수와 연산자, 그리고 입력함수에 대하여 알았습니다.