목차는 다음과 같다.

  • 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.8 Layout of a C Program

우리는 C 프로그램을 토큰의 집합으로 생각할 수 있다. 토큰은 의미를 바꾸지 않고는 나눌수 없는 캐릭터들의 그룹을 의미하며, 식별자와 키워드가 포함된다. +나 -와 같은 연산자, 쉼표, 세미콜론, 리터럴 문자열 같은 문장부호도 포함된다. 예를 들어서 다음 statement에는 7개의 토큰이 존재한다.

 

printf("Height : %d\n, height);
printf     (     "Height : %d\n     ,      height      )         ; 
  ①        ②              ③         ④         ⑤        ⑥         ⑦

토큰 는 식별자이고, 토큰 은 리터럴문자열, , , 토큰과 은 문장부호이다.

대부분의 경우 프로그램에서 토큰 사이의 공간은 중요하지 않다. 극단적으로, 토큰끼리 공간이 아예 없이 합쳐질수도 있다. (두 토큰이 합쳐져 제 3의 토큰이 되는 경우는 제외한다.) 예를 들어, 2.6장의 celsius.c 프로그램에서 대부분의 공간을 삭제할 수 있다. int와 main, float과 fahrenheit같은 토큰은 공백을 제공하고 대부분 공백을 지우는 것이 가능하다.

/* Converts 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;}

사실, 페이지가 더 넓다면, 우리는 전체 main함수를 한줄에 놓을수 있다. 하지만, 프로그램 전체를 한 줄에 놓을수는 없다. 각 전처리문은 별도의 줄을 요구하기 때문이다. 이런식으로 프로그램을 압축하는 것은 좋지 않다. 오히려, 프로그램에 공백과 빈 줄을 추가하면 읽고 이해하는 것이 더 쉬워질 수 있다. 다행히도, C는 공백, 탭키, 개행문자를 토큰 사이에 무제한으로 넣을 수 있게한다. 이런 규칙은 프로그램 레이아웃을 위한 몇가지 중요한 결과를 갖게된다. 

  • statement는 여러줄에 걸쳐 나눠질수 있다. 예를 들어 다음 statement는 너무 길기 때문에 한줄에 끼워넣기가 어렵다. 
printf("Dimensional weight (pounds) : %d\n",
  (volume + INCHES_PER_POUND -1)/ INCHES_PER_POUND);
  • 토큰 사이의 공간은 눈이 토큰을 직관적으로 분리할수 있도록 한다. 이런 이유로, 연산자 앞뒤로 공백을 두기도한다.
volume = height * length * width
  • 또한 각 쉼표 뒤에 공백을 넣는다. 어떤 프로그래머들은 심지어, 괄호나 문장기호 주변에 공백을 넣기도 한다.
  • Indentation

2.7 Identifiers

프로그램을 작성할때 변수, 함수, 매크로 및 기타 엔티티의 이름을 정해야하는데, 이런 이름을 식별자라고 한다. C에서 식별자는 문자, 숫자, 밑줄까지 포함하나, 문자 혹은 밑줄로 시작해야하는 규칙이 있다. (C99에서 식별자는 특정 "범용 문자 이름"을 포함할 수도 있다.)

다음은 가능한 식별자의 예이다.

times10            get_next_char          _done

다음은 불가능한 식별자들이다.

10times       get-next-char

10times는 문자나 밑줄이 아닌 숫자로 시작하고, get-next-char 는 밑줄이 아닌 마이너스 기호(-)를 사용했기에 불가능하다.

C는 대문자를 구분하기에 식별자에서도 대소문자를 구분한다. 예를 들면, 다음 식별자들은 모두 다르다.

job   joB   jOb  jOB   Job   JoB   JOb   JOB

이 8개의 식별자는 각각 완전히 다른 방식으로 동시에 사용될 수 있다. (이 경우는 난독화를 사용하는 경우이다.) 분별있는 프로그래머들은 다소 관계가 있는 식별자가 아닌한, 다르게 보이게 하려고 노력한다. C에서는 대소문자구분이 중요하기 때문에 많은 프로그래머들은 가독성을 위해 필요한 경우에 밑줄을 삽입하고 매크로를 제외한 식별자에서 소문자만 사용하는 규칙을 따른다.

symbol_table    current_page    name_and_address

다른 프로그래머들은 밑줄을 사용하지 않는 대신 대문자를 사용하여 식별자 내에서 각 단어를 시작한다.

symbolTable      currentPage     nameAndAddress

(첫 글자도 대문자로 표시하기도 한다.) 앞의 스타일은 전통적인 C에서 흔히 볼수 있지만, 후자의 경우 JAVA와 C#에서 널리 사용되기 때문에 더욱 인기가 있다. 다른 합리적인 규칙도 있는데, 매번 프로그램에 나타나는 것과 동일한 방식으로 식별자를 대문자로 표시하는 것이다. 

C는 식별자의 최대 길이에 제한을 두지 않으므로 길고 설명이 되는 이름을 사용하는 것을 권장한다. current_page같은 식별자는 cp라는 이름보다 이해하기 쉽다.

Keywords

표 2.1의 키워드는 C컴파일러에 특별한 의미가 있으므로 식별자로 사용할 수 없다. C99에서 5개의 키워드가 추가되었다.

auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof _Bool
continue if static _Complex
default inline struct _Imaginary
do int switch  
double long typedef 표 2.1
else register union (이탤릭체는 C99에서만)

C는 대소문자를 구분하기 때문에 키워드는 표 2.1에 표시된 대로 소문자로 정확히 프로그램에 나타내야한다. 표준 라이브러리의 함수이름(예를 들면, printf)에는 소문자만 포함된다. 전체 프로그램을 대문자로 입력하는 불행한 프로그래머의 곤경을 피해야한다. 컴파일러는 라이브러리 함수의 키워드와 호출을 구분할 수 없다.

 

식별자에 대한 다른 제한에 대해 주의해야한다. 일부 컴파일러는 특정 식별자(ex: asm)을 추가 키워드로 취급한다. 표준 라이브러리에 속하는 식별자도 제한된다. 이러한 이름중 하나를 잘못사용하면 컴파일 또는 연결중에 오류가 발생할 수 있다. 밑줄로 시작하는 식별자도 제한된다.

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의 일반적인 원칙중 하나를 보여준다. 

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

 

+ Recent posts