목차는 다음과 같다.

  • 3.1 The printf Function
    • Conversion Specifiactions
    • Program: Using printf to Format Numbers
    • Escape Sequences
  • 3.2 The scanf Function
    • How scanf Works
    • Ordinary characters in Format Strings
    • Confusing printf with scanf
    • Program: Adding Fractions

2장에 비하면 비교적 짧은 내용인것 같다.

2.6 Defining Names for Constants

프로그램에 상수가 포함되어 있을 때는 종종 상수에 이름을 붙이는 것이 좋다. dweight.c나 dweight2.c 프로그램은 상수 166에 의존하는데, 그 의미는 프로그램을 읽는 다른 사람에게 모호할 수 있다. 매크로 함수를 이용하여, 이 상수의 이름을 다음과 같이 지을수 있다.

#define INCHES_PER_POUND 165

#define은 #include와 마찬가지로 전처리문이기에, 줄의 끝에는 세미콜론을 붙이지 않는다.

프로그램이 컴파일될 때, 전처리기는 각각의 매크로를 그것이 나타내는 값으로 대체한다. 예를 들어 다음 문장은

weight = (volume + INCHES_PER_POUND -1) / INCHES_PER_POUND;

 다음과 같이 

weight = (volume + 166 -1) / 166;

뒤의 문장을 쓴 것과 같은 효과가 나타난다. 매크로의 값은 expression(수식)으로 될 수 있다.

#define RECIPREOCAL_OF_PI (1.0f / 3.14159f)

만약 연산자를 포함한다면, 식을 괄호로 묶어주어야한다. 

매크로 이름에는 대문자만 사용했는데, 이것은 대다수의 C프로그래머들이 따르는 규칙이다. (필수사항은 아니다.)

그렇지만 관례가 있기에 이 규칙을 따르는 것이 좋을 것이다.

PROGRAM: Converting from Fahrenheit to Celsius

다음 프로그램은 사용자에게 화씨 온도를 입력하라는 메시지를 표시하고 동일한 섭씨 온도를 인쇄한다. 프로그램의 출력은 다음처럼 된다.

Enter Fahrenheit temperature: 212 //212는 사용자 입력값
Celsius equivalent: 100.0

이 프로그램은 정수가 아닌 온도도 허용해야하기에, 섭씨온도가 100이 아닌 100.0으로 표시된다. 

/* Convers a Fahrenheit temperature to Celsius */

#include <stdio.h>

#define FREEZING_PT 32.0f
#define SCALE_FACTOR (5.0f / 9.0f)

int main(void)
{
	float fahrenheit, celsius;
    
    printf("Enter Fahrenheit temperature: ");
    scanf("%f", &fahrenheit);
    
    celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;
    
    printf("Celsius equivalent: %.1f\n", celsius);
    
    return 0;
}

문장 celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;는 화씨 온도를 섭씨로 바꿔준다. FREEZING_PT가 32.0f를 의미하고, SCALE_FACTOR가 (5.0f / 9.0f) 를 의미하기에 컴파일러는 다음처럼 해석한다.

celsius = (fahrenheit - 32.0f) * (5.0f / 9.0f);

SCALE_FACTOR를 (5.0f / 9.0f)로 쓰는것은 중요한 사항이다. 5/9로 쓴다면 C가 두 정수가 나뉘는 것으로 생각하여 자른 결과를 준다. 5/9는 0이 될 것이고, 우리가 원하는 결과가 나오지 않는다.

printf의 호출은 섭씨를 기록하기 위함이다. %.1f를 사용하여 섭씨가 소숫점 뒤 한자리만 나오도록 표시했다.

2.5 Reading Input

dweight.c 프로그램이 박스 단 하나의 dimensional weight를 계산하기 때문에, 특별히 유용한것은 아니다. 프로그램을 개선하려면 우리는 사용자가 dimension을 입력하도록 허용할 필요가 있다. 

입력을 갖기 위해서는, printf와 상응하는 C라이브러리의 scanf함수를 사용할 것이다. scanf의 f는 printf와 마찬가지로 "formatted"를 의미하며, 둘 모두 입력 또는 출력 데이터의 모양을 지정하기 위해 형식문자열(format string)을 사용해야한다. scanf는 printf가 어떻게 출력데이터를 표시할지 알아야하는 것처럼, 어떤 형식의 입력데이터가 들어올지 알아야한다. int 값을 읽기 위해 우리는 다음과 같이 scanf를 쓸 것이다.

scanf("%d", &i); /* reads an integer; stores into i */

%d 문자열은 scanf에게 정수를 나타내는 입력을 읽도록 지시하며, i는 scanf가 입력을 저장하도록 하는 int 변수이다. 현재는 &기호를 설명하기 어려우니, scanf를 사용할때 필수적으로 사용한다고 생각하자.(그러나 항상 그런것만은 아니다.)

float값을 읽으려면 약간 다른 scanf의 호출이 필요하다.

scanf("%f", &x); /* reads a float value; stores into x */

%f 는 float 변수인 경우에만 사용할 수 있다. 그러므로 x라는 변수는 float 변수임을 짐작할 수 있을 것이다 %f 문자열은 scanf가 float 형식의 입력값을 찾도록 지시한다. (소숫점을 가질 수도 있으나, 없어도 됨.)

 

PROGRAM: Computing the Dimensional Weight of a Box(Revisited)

다음은 유저가 수치를 직접 입력할 수 있는 향상된 버전의 dimensional weight 프로그램이다. 각각의 scanf 호출은 printf의 호출을 선행한다. 이렇게 하면 사용자는 입력 시기와 무엇을 입력할 지 알 수 있다.

/* dweight2.c 
   Computes the dimensional weight of a box from input provided by the user*/
  
 #include <stdio.h>
 
 int main(void)
 {
   int height, length, width, volume, weight;
   printf("Enter height of box: ");
   scanf("%d", &height);
   printf("Enter length of box: ");
   scanf("%d", &length);
   printf("Enter width of box: ");
   scanf("%d", &width);
   volume = height * length * width;
   weight = (volume + 165) / 166;
   
   printf("Volume (cubic inches): %d\n", volume);
   printf("Dimensional weight (pounds): %d\n", weight);
   
   return 0;
 }
 

프로그램은 다음과 같이 출력된다. (사용자 입력부분은 주석표시함)

Enter height of box: 8         //사용자입력:8
Enter length of box: 12        //사용자입력:12
Enter width of box: 10         //사용자입력:10
Volume (cubic inches): 960
Dimensional weight (pounds): 6

사용자에게 입력값(프롬프트)를 입력하라는 메세지는 일반적으로 개행문자로 끝나면 안된다. 사용자가 프롬프트 자체와 동일한 줄에 값을 입력하기를 희망하기 때문이다. 사용자가 엔터키를 누르면 커서가 자동으로 다음줄로 이동하므로, 현재 줄을 종료하기 위한 개행문자를 표시할 필요가 없다.

dweight2.c 프로그램에 문제가 있는데, 사용자가 숫자가 아닌 값을 입력하는 경우 프로그램은 제대로 작동하지 않는다. 이 부분은 3.2장에서 자세하게 다룰 것이다.

2.4 Variables and Assignment

 2.1장의 프로그램만큼 간단한 프로그램은 거의 없다. 대부분의 프로그램은 출력을 생성하기 전에 일련의 계산을 수행해야 하므로 프로그램 실행 중에 데이터를 일시적으로 저장할 수 있는 방법이 필요하다. C에서는 대부분의 프로그래밍 언어와 같이 이러한 저장 위치를 ''변수''라고 말한다.

Types

 모든 변수에는 저장할 데이터의 종류를 지정하는 '형'이 있어야 한다. C는 형이 매우 다양한데, 지금은 int와 float 두개에 대해서만 공부할 것이다. '형'은 변수 저장 방법과 변수에 대해 수행할 수 있는 작업에 영향을 미치기 때문에 적절한 형을 선택하는 것이 중요하다. 숫자 변수의 형은 변수가 저장할 수 있는 가장 큰 숫자와 가장 작은 숫자를 결정한다. 또한 소숫점 이하의 자리수가 있는지의 여부에 따라 결정된다.

 int(정수integer의 줄임) 변수는 0, 1, 392, -2533같은 정수 전체를 저장할 수 있다. 그러나, 가능한 값의 범위는 제한되어 있는데, 가장 큰 수는 보통 2,147,483,647(21억 4548만 3647)이지만, 32,767만큼의 오차가 있을 수 있다.(하드웨어에 따라서)

 float(부동소수점 floating-point의 줄임) 변수는 int 변수보다 훨씬 큰 숫자를 저장할 수 있으며, 379.125같은 소수를 저장할 수 있다. 하지만 단점이 있는데, 소수의 연산은 int 숫자의 연산보다 느릴 수 있다. 가장 중요한 것은 종종 저장된 값이 원래 숫자의 근사치로 나올때가 있다는 것이다. 예를 들어 부동 변수에 0.1을 저장했을때 나중에 반올림 오류로 인해 0.099999997과 같은 값을 갖기도 한다. 

Declarations

변수를 사용하려면 컴파일러를 위해서 먼저 변수를 선언해야 한다. 변수를 선언하기 위해 먼저, 변수의 유형, 변수이름을 지정한다. (변수 이름은 임의로 하되, 2.7장에 규칙을 적어두었다.) 예를 들면 다음과 같이 높이, 이익에 대한 변수를 선언할 수 있다.

int height;
float profit;

첫번째 선언문은 높이가 int형의 변수임을 나타내며, 높이가 정수값을 저장할 수 있음을 의미한다. 두번째 선언문도 float 형으로 마찬가지로 설명을 할 수 있다.

 여러 변수의 형이 동일하면, 선언문을 합칠수 있다.

int height, length, width, volume;
float profit, loss;

각각의 선언은 세미콜론으로 끝난다.

 첫번째 템플릿의 main함수에서는 선언을 포함하지 않았다. main에 변수를 포함할때, 선행해야할 문장이 있다.

int main(void)
{
  declarations //변수
  statements   //문장
}

9장에서 보겠지만, 이것은 블록(임베디드 선언이 포함된 문장)에서와 마찬가지로 일반적인 함수에서 따라야한다. 스타일의 문제이지만, 선언과 문장 사이에 공백을 남기는 것도 좋은 방법이다.

C99에서는 선언문이 문장 앞에 나올 필요가 없다. 예를 들어 main은 선언-문장-또다른 선언이 허용된다. 이전 컴파일러와의 호환성을 위해, 이 책의 프로그램은 이번 룰을 따르지 않는다. 그러나 C++이나 Java 프로그램에서는 선언을 처음으로 필요할때까지 넣지 않는 것이 흔한 일이다. 

Assignment

변수는 할당을 통해 값을 지정할 수 있다. 예를 들어, 다음 문장은 height, length, width에 대해 값을 할당한다.

height = 8;
length = 12;
width = 10;

8, 12, 10은 상수라고 부른다. 변수를 할당하거나, 다른 방법으로 사용하기 위해서는 먼저 변수를 선언해야한다.

그러므로 다음과 같이 쓸수 있다.

int height;
height = 8;

하지만 다음처럼은 쓸 수 없다.

height = 8; /*** WRONG ***/
int height;

float변수에 할당된 상수에는 일반적으로 소수점이 포함된다. 예를 들어 수익이 float변수일 경우 다음과 같이 쓸 수 있다.

profit = 2150.48;

float 변수에 숫자를 할당할때, 다음과 같이 소숫점이 있는 상수에 float을 뜻하는 f를 덧붙이는 것이 좋다.

profit = 2150.48f;

f를 포함하지 않으면 컴파일러에서 경고가 발생할 수도 있다.

 일반적으로 int형 변수에는 int형 값이 할당되고, float형 변수에서는 float형 값이 할당된다. 4.2장에서 볼겠지만, 형을 혼합하는 것(예를 들면, float 변수에 int 값을 할당하거나 int 변수에 float값을 할당하는것)은 가능하지만, 안전하지 않다.

변수가 할당되면 다음 변수의 값을 계산하는데 사용할 수 있다.

height = 8;
length = 12;
width = 10;
volume = height * length * width;     /*  volume is now 960  */ 

C에서는 곱셈 연산자를 *로 표현한다. 그래서 이 문장은 height, length, width 에 저장된 값을 곱하고, 값을 변수 volume에 저장하는 문장이다. 일반적으로 할당의 오른쪽은 상수, 변수, 연산자를 포함한 수식(C에서는 이를, 표현식이라고 한다)이 될 수 있다.

원어로 읽다보니 헷갈리는 부분이 있었는데, 바로 이 부분이었다. statement와 expression 는 둘 다 코드의 의미로 쓰인다는 느낌이 있었는데 명확하게 하면 다음과 같다. the right side of an assignment can be a formula. (or expression) 에서 볼 수 있듯이, 할당의 오른쪽 부분에 사용될 수 있는 "수식"이 expression이다. statement는 2.3에서 설명이 되었지만, 프로그램이 동작할 수 있는 '명령단위'를 말한다. A statement is a command to be executed when the program runs. 즉, expression은 statement 의 부분집합이라고 볼 수 있다. 또한 expression의 경우 return 이 있어야 하지만, statement의 경우에는 return이 반드시 있어야 하는것은 아니다.

Printing the Value of a Variable

printf를 사용하면 변수의 현재값을 표시할 수 있다. 예를 들어 

Height : h

이라고 작성하면 h는  height 변수의 현재 값이고, printf를 통해 다음처럼 불러낼수 있다.

printf("Height: %d\n", height);

%d는 프린트하는 동안 값이 채워질 위치를 표시하는 placeholder(자리표시자)이다. %d 바로 뒤에 있는 \n가 하는 역할은, printf가 height의 값을 출력한 후 다음줄에서 동작하도록 한다.

%d 는 int 변수에 대해서만 작동하며, float 변수를 프린트하려면 %f를 사용한다. 기본적으로 %f는 소숫점 뒤 6자리까지 표시한다. 소숫점 뒤에 p자리까지 표시하도록 하려면 %와 f사이에 .p를 넣어서 다음처럼 출력하면 된다.

Profit: $2150.48
printf("Profit: $%2.f\n", profit);

printf의 호출 한번으로 출력할 수 있는 변수의 개수는 무한대이다. height, length 변수를 모두 표시하기 위해 다음처럼 printf를 호출 할 수 있다.

printf("Height: %d Length: %d\n", height, length);

PROGRAM: Computing the Dimensional Weight of a Box

운송회사들은 부피가 크지만 가벼운 박스들을 좋아하지 않는다. 트럭이나 비행기의 공간을 낭비하기 때문이다 사실, 회사들은 그러한 상자들에 추가요금을 부과한다. 미국에서 주로 쓰는 방법은 부피를 166인치(파운드당 입방 인치 허용)로 나누는 것이다. 상자의 "dimensional", "volumable"한 무게가 "actual"한 무게를 초과하면 추가요금은 "dimensional"한 무게를 기반으로 한다. (166 디바이저는 국제 발송을 위한것이고, 국내 발송의 치수 중량은 194를 기준으로 계산한다.)

우리가 상자의 치수를 계산하는 프로그램을 작성하는 운송회사 직원이라고 가정해보자. C를 시작한 이후로 당신은 처음으로 12''X10''X8''크기의 입방체 박스의 dimensional weight를 계산하는 프로그램을 작성하려고 결심한다. 나눗셈은 C에서는 /(슬래시)로 나타내고, dimensional weight를 나타내려면 다음과 같이 할 수 있을 것이다.

weight = volume / 166;

weight와 volume은 정수변수로, 박스의 무게와 부피를 나타낸다. 안타깝지만, 이 공식은 우리가 필요한 공식과는 다르다. C에서 하나의 정수를 다른 정수로 나누면, 답이 "truncated"된다. (생략되다, 잘리다) 즉, 소수점 뒤의 모든 숫자를 잃게된다. 12''X10''X8''인 박스의 부피는 960 입방인치가 된다. 166으로 나누면 5.783대신 5라는 답이 나오게 되고, 운송회사가 요구하는 반올림이 아닌, 더 낮은 파운드로 내림하게 된다. (운송회사의 입장에서는 더 많은 이익을 추구한다.) 한가지 해결책은 166으로 나누기 전, 165를 더하는 것이다.

weight = (volume + 165) / 166;

166의 부피는 331/166이나 1의 중량을 표시하며, 167의 부피는 332/166이나 2로 산출된다. 이러한 방식으로 무게를 제공하면 다음과 같은 프로그램을 작성할 수 있다.

/* dweight.c 
   computers the dimensional weight of a 12" x 10" x 8" box */
  
 #include <stdio.h>
 
 int main(void)
 {
   int height, length, width, volume, weight;
   height = 8;
   length = 12;
   width = 10;
   volume = height * length * width;
   weight = (volume + 165) / 166;
   
   printf("Dimensions: % dx%dx%d\n", length, width, height);
   printf("volume (cubic inches): %d\n", volume);
   printf("Dimensional weight (pounds): %d\n", weight);
   
   return 0;
 }
 

결과는 다음과 같이 나온다.

Dimensions: 12x10x8
Volume (cubic inches): 960
Dimensional weight (pounds): 6

Initialization

일부 변수는 프로그램 실행 시작시 자동으로 0으로 설정되지만, 대부분은 그렇지 않다. 기본값이 없고 프로그램에서 아직 값을 할당하지 않은 변수를 초기화되지않은 변수라고 한다.

초기화되지 않은 변수 (예를 들면, 식에서 사용하거나 printf를 사용하기 위해 쓰는 변수) 의 값에 엑세스하려고 시도하면 2568, -30891과 같은 이상한 수가 나오며 예측 불가능한 결과가 발생할 수 있다. 일부 컴파일러에서는 프로그램 충돌과 같은 더 심각한 문제가 생길수도 있다.

물론, 항상 변수를 할당함으로써 초기값을 줄 수 있다. 하지만, 더 변수의 초기값을 선언문에 넣음으로 더 쉽게 할수 있다. 예를 들어 높이변수를 선언하고, 한단계로 초기화할 수 있다.

int height = 8;

C전문용어로는 값 8을 initializer(이니셜라이저)라고 한다. 

변수는 모두 동일하게 선언하여 초기화할 수 있다.

int height = 8, length = 12, width = 10;

각 변수에는 자체 이니셜라이저가 필요하다. 다음 예에서 이니셜라이저 10은 초기화되지 않은 상태로 남아있는 height와 length가 아닌 width변수에만 사용된다.

int height, length, width = 10;

Printing Expressions

printf는 변수에 저장된 숫자를 표시할 뿐만 아니라, 숫자 식의 값을 표시할 수 있다. 이 속성을 사용하면 프로그램을 단순화하고 변수 수를 줄일 수 있다.

volume = height * length * width;
printf("%d\n", volume);

예를 들어, 위의 문장은 아래처럼 바뀔수 있다.

printf("%d\n", height * length * width);

표현식을 인쇄하는 printf의 능력은 C의 일반적인 원칙중 하나를 보여준다. 

값이 필요한 모든 곳에서 동일한 유형의 식을 사용할 수 있다.

 

2.3 Comments

 우리의 pun.c 프로그램은 아직 부족하다. 바로 문서화이다. 모든 프로그램에는 프로그램 이름, 작성된 날짜, 작성자, 프로그램의 목적 등 식별 정보가 포함되어야 한다. C에서 이 정보는 주석에 배치하면 된다. 기호 /*는 주석의 시작부분을 표시하고 기호 */는 끝부분을 표시한다.

*/ This is a comment */

 주석은 프로그램의 거의 모든곳에서 별도의 행이나 다른 프로그램 텍스트와 같은 행에 나타낼 수 있다. pun.c의 시작부분에는 다음과 같이 주석을 쓸 수 있다.

/* Name: pun.c                 */
/* Purpose: Prints a bad pun.  */
/* Author: K. N. King          */

#include <stdio.h>

int main(void)
{
    printf("To C or not to C: that is the question.\n");
    return 0;
}

 주석은 둘 이상의 줄에 걸쳐 확장할 수 있다. 컴파일러가 /*기호를 확인한 후 */기호를 만날때 까지는 이어지는 내용을 읽고 무시한다. 위 주석을 다음과 같이 짧게 만들 수 있다.

/* Name: pun.c                
   Purpose: Prints a bad pun.  
   Author: K. N. King          */

 하지만, 가독성이 떨어지기 때문에 권하지는 않는다. 차라리 다음과 같이 하면 도움이 된다.

/* Name: pun.c                
   Purpose: Prints a bad pun.  
   Author: K. N. King     
*/

더 좋은 방식의 주석은, 다음처럼 박스로 만드는 것이다.

/*************************************
 * Name: pun.c                       *
 * Purpose: Prints a bad pun.        *
 * Author: K. N. King                * 
 *************************************/

가끔씩 박스형 주석을 단순화 시키는 프로그래머들도 있다.

/*
 * Name: pun.c 
 * Purpose: Prints a bad pun. 
 * Author: K. N. King 
 */

짧은 주석은 프로그램 코드와 같은 줄에도 표시될 수 있다.

int main(void)  /*Beginning of main program*/

이런 주석을 날개형 주석이라고도 부른다.

C99부터는 다음과 같은 주석을 제공한다.

//This is a comment

이런 주석 유형은 줄 끝에서 자동으로 끝난다. 두줄 이상의 주석을 만드려면 이전 버전 주석(/**/)을 사용하거나 각 주석의 줄 시작부분에 넣으면 된다.

// Name: pun.c
// Purpose: Prints a bad pun.
// Author: K. N. King

새로운 주석 스타일은 두가지 중요한 점이 있는데, 첫번째로 코멘트가 자동으로 줄의 끝에서 끝나기 때문에 종료되지 않은 주석이 프로그램의 일부를 실수로 가릴 가능성이 없다. 두번째로, 각 줄에 요구되는 // 덕분에 긴 줄의 주석이 돋보인다.

2.2 The General Form of a Simple Program

pun.c에 대해서 깊게 알아보고, 이것을 일반화시켜보는 단원이다. C에는 다음과 같은 형식이 있다.

directives (전처리문)

int main(void)
{
  statements (명령문)
}

이 템플릿에서, 그리고 이 책의 다른곳에서 있는 유사한 템플릿에서는 Courier 체로 인쇄된 항목은 C 프로그램에서 보여준대로 정확히 등장해야하는 부분이다. Italics 체로 인쇄된 항목의 경우 프로그래머가 제공하는 텍스트를 나타낸다. (티스토리에서는 코드블록 사용시 폰트 적용이 안되기에, 필요한 경우 책을 참고하길 바란다.)

중괄호가 main 시작지점과 끝지점을 표시하는 방법에 주의해라. 다른 언어들이 begin 이나 end 를 쓰는 것처럼 C는 { 와 }를 사용한다. 이런 점에서 C에대한 일반적인 부분을 설명할 수 있다. 바로, C프로그램은 간결성 때문에 약어와 특수 기호에 크게 의존한다는 것이다. 

가장 간단한 C 프로그램도 다음 세가지 핵심 언어 기능에 의존한다. 전처리문(컴파일 전에 프로그램을 수정하는 명령 편집), 함수( main처럼 실행 가능한 코드의 함수명이 지어진 블록), 명령문(프로그램이 실행될 때 수행할 명령)

Directives 전처리문

C 프로그램은 컴파일되기 전에 전처리기에 의해 편집된다. 전처리기의 명령어를 전처리문이라고 한다. 14, 15장에서 깊게 배우겠지만, 지금은 #include 에 대해서만 배운다. pun.c 프로그램은 다음처럼 시작된다.

#include <stdio.h>

이 지시문은 <stdio.h>의 정보가 프로그램이 컴파일 되기 전에 포함됨을 명시한다. <stdio.h>에는 C의 표준입출력에 대한 정보가 포함되어있다. C는 <stdio.h>와 같은 헤더파일이 많은데 이는 각각 표준 라이브러리의 일부를 포함하고 있다. C에서 <stdio.h>를 포함해야하는 이유는, 다른 프로그래밍언어와는 다르게, '읽고 쓰는' 명령어가 내재되어있지 않기 때문이다. 대신, 입출력을 수행하도록 하는 능력은 표준라이브러리의 기능에 제공된다.

전처리문은 항상 C프로그램의 다른 항목과 구별되는 # 문자로 시작한다. 기본적으로 전처리문은 한줄 길이이며 전처리문 끝에는 세미콜론이나 다른 특수 문자가 없다.

Functions 함수

함수는 다른 프로그래밍 언어의 'procedures'나 'subroutines'와 같다. 그것들은 프로그램을 구성하는 블록을 쌓는 것이다. 사실상 C프로그램이 더 함수의 종류가 많다. 함수는 두 종류로 나뉘는데, 프로그래머가 직접쓴것과, C도구로 제공되는 것이다. 나중에 라이브러리 함수에서 언급하겠지만, '라이브러리'에 속해있는 함수이기때문에 컴파일러를 지원한다. 

 수학에서, 하나 이상의 인수가 주어졌을때 값을 계산하기 위한 규칙인 함수에서 이름을 따왔다.

C는 함수라는 용어를 더 확장시켰다. C에서 함수는 단순하게 "함께 그룹화되어 이름이 지정된 일련의 명령문"이다. 어떤 함수는 값을 계산하지만, 그렇지 않은 함수도 있다. 값을 계산하는 함수는 반환문을 사용하여 리턴값을 지정한다. 예를 들어 인수에 1을 더하는 함수는 다음과 같은 문장이 나온다.

return x+1;

서로 다른 인수의 제곱의 차를 계산하는 함수는 다음과 같은 문장으로 쓸 수 있다.

return y*y-z*z;

C 프로그램은 많은 함수로 구성될 수 있지만, main함수는 필수적으로 필요하다. main함수는 특별한데, 프로그램이 실행될 때 자동으로 호출된다는 점이다. 다른 함수에 대해 배우는 9장 전까지는 main함수가 프로그램에서 유일한 함수가 될것이다. 

main함수의 경우, 값을 반환하는가? 그렇다. 프로그램이 종료될 때 운영체제에 제공된 상태코드를 반환한다. pun.c 프로그램에서의 경우를 보자.

#include <stdio.h>

int main(void)
{
    printf("To C or not to C: that is the question.\n");
    return 0;
}

main함수 바로 앖의 int는 main함수가 정수값을 반환함을 뜻한다. 괄호 안의 void는 main에 인수가 없음을 뜻한다.

return 0;이란 문장은 두가지 기능이 있다. 프로그램을 종료하기 위해 main함수가 종료되도록 하고, main함수의 값이 0이 반환됨을 지시해준다. 나중에 main의 리턴값에 대해 알아보겠지만, 지금은 main은 프로그램을 종료하기 위해 항상 0을 리턴한다고 생각하자.

Statements 문장

문장은 프로그램이 동작할 때의 실행할 명령이다. 이 책의 5, 6장에서 자세히 살펴볼것이다. pun.c 프로그램은 딱 두종류의 문장을 사용하는데, 하나는 리턴문이고, 하나는 함수 호출이다. 할당된 작업을 수행하기 위해 함수를 요청하는 것은 함수 호출이라고 한다. 예를 들어 pun.c 프로그램은 printf함수를 호출하여 화면에 문자열을 표시한다.

printf("To C or not to C: that is the question.\n");

C는 각 문장이 세미콜론으로 끝나도록 요구한다. (단, 복합문에서는 예외이다.) 세미콜론은 컴퓨터에게 문장이 끝나는 점을 보여주기에 문장은 여러 줄에 걸쳐 작성해도 항상 끝나는 지점이 명백하다. 반면 전처리문은 한줄을 기본으로 쓰며, 세미콜론을 사용하지 않는다.

Printing Strings 문자열 출력

printf는 3장에서도 보겠지만, 강력한 함수이다. 지금까지는 큰따옴표로 묶인 문자열상수를 표시하는데만 printf를 사용했다. printf는 문자열 상수를 표시할 때 큰따옴표까지 화면에 보여주지는 않는다.

한번 출력이 되면, 다음 출력라인으로 자동으로 이동하지 않는다. printf에 한줄을 띄우도록 지시하려면 출력할 문자열에 \n(개행 문자)를 포함해야 한다. 개행문자를 작성하면 현재 출력하는 줄이 종료되고 다음 출력은 다음줄로 이동한다. 따라서 다음 두 코드는 같은 결과를 표시한다.

printf("To C or not to C: that is the question.\n");

printf("To C or not to C: ");
printf("that is the question.\n");

개행 문자는 문자열상수에 두번 이상 나타날 수 있는데, 다음 메세지를 코드로 작성하면 그다음과 같다.

Brevity is the soul of wit.
  --Shakespeare
printf("Brevity is the soul of wit.\n --Shakespeare\n);

+ Recent posts