# Understanding C Language: Basic Structure (2/2)

---

**Contents**

**1️⃣**출력 함수(Output function)  
**2️⃣**입력 함수(Input function)  
**3️⃣**대입 연산(Assignment operation)  
**4️⃣**산술 연산 (Arithmetic operation)

---

## **1️⃣**출력 함수(Output function)

**라이브러리 함수(Library function)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726968911605/95b576dc-4801-491f-8701-54d78b1d238b.png align="center")

라이브러리 함수는 컴파일러나 프로그래밍 언어가 제공하는 함수로, 프로그래머가 반복적으로 사용되는 기능을 쉽게 구현할 수 있도록 도와준다. 이를 통해 프로그래머는 저수준의 코드 작성 없이도 자주 쓰이는 기능을 쉽게 활용할 수 있다.

위의 이미지에 있는 내용은 **scanf()**와 **printf()** 함수의 작동을 설명하는 다이어그램이다.

1. **변수 x에 값 20이 저장되어 있음**:
    
    * 프로그램 내에서 변수 `x`에 값 `20`이 저장되어 있다.
        

**주요 라이브러리 함수 예시:**

**printf()**: 모니터에 출력을 하기 위한 함수이다.

* * 위 그림에서는 `printf()` 함수가 변수 `x`에 저장된 값을 출력하는 과정이 나타나 있다.
        
* **scanf()**: 키보드로부터 입력을 받아 변수에 값을 저장하는 함수이다.
    
    * 위 그림에서는 `scanf()` 함수가 변수 `x`에 값을 저장하는 과정이 설명되어 있다.
        

이 외에도 많은 라이브러리 함수들이 있으며, 이를 통해 다양한 입출력, 수학 계산, 문자열 처리 등의 작업을 쉽게 수행할 수 있게된다.

---

**문자열 출력(String output)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972698332/1e032dfa-74f2-4c6f-bb3c-72461e26ba2f.png align="center")

* **printf() 함수**를 사용하여 문자열을 출력할 수 있다. 예를 들어:
    

```c
printf("Hello World!\n");
```

위 코드는 \*\*"Hello World!"\*\*라는 문자열을 출력하고, \*\*`\n`\*\*은 줄바꿈을 의미한다.

**문자열(String)**

* **문자열**은 문자들이 여러 개 나열된 것으로, 예를 들어 \*\*"Hello World!\\n"\*\*와 같은 형태이다. 이 문자열은 여러 문자가 연속적으로 배치된 형태이며, 마지막에는 항상 **null 문자**(`\0`)가 자동으로 붙어 문자열의 끝을 나타낸다.
    
* `"Hello World!\n"` 문자열의 구조:
    
    * `H, e, l, l, o, , W, o, r, l, d, !, \n` (문자들이 차례로 나열됨)
        
    * `\n`: 줄바꿈을 위한 특수 문자
        
    * `\0`: 문자열의 끝을 나타내는 null 문자 (보이지 않음)
        

문자열은 C 언어에서 큰 따옴표(`" "`)로 묶어서 표현하며, 이를 `printf()` 함수로 출력할 수 있다.

---

**변수값 출력(Variable value output)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972706063/bdfd6403-1880-4606-becd-849c0842125f.png align="center")

문자열을 출력할 때, 변수를 함께 출력하는 구문에서 약간의 수정이 필요하다. `printf` 함수 내에서 변수의 값을 출력할 때는 **형식 지정자**(`%d` 등)와 함께 변수를 정확한 위치에 전달해야 한다.

다음은 올바른 코드 예시이다.:

```c
printf("두 수의 합: %d\n", sum);
```

**설명**:

* **"두 수의 합: %d\\n"**: 이 부분은 문자열을 출력한다. \*\*`%d`\*\*는 정수형 데이터를 출력하기 위한 형식 지정자이다.
    
* **sum**: 이 부분은 실제로 출력하고자 하는 변수이다. `printf()` 함수는 첫 번째 인자로 출력 형식을 받으며, 그 뒤에 출력할 값을 넘겨준다.
    

즉, \*\*`%d`\*\*는 `sum` 변수의 값을 해당 위치에 출력하도록 지정하는 역할을 한다.

---

**형식 지정자(Format specifier)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972714373/47dba045-9668-42da-b3d5-2bad8ee429e3.png align="center")

각 형식 지정자는 변수나 값을 특정 방식으로 출력하기 위해 사용된다.

%d: decimal의 약자  
%f: float의 약자  
%c: character의 약자  
%s: string의 약자

---

**여러개의 변수값 출력(Output multiple variable values)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972719646/9863ea5e-235f-4cea-997f-96c8e53cfaa7.png align="center")

이미지에는 여러 개의 변수 값을 출력하는 `printf()` 함수의 사용법이 설명되어 있다.

**설명:**

* **코드**: `printf("%d %f", number, grade);`
    
    * 여기서 \*\*`%d`\*\*는 정수형 변수를 출력하고, \*\*`%f`\*\*는 실수형 변수를 출력하는 형식 지정자이다.
        
    * \*\*`number`\*\*와 \*\*`grade`\*\*는 각각 정수형과 실수형 변수를 의미한다.
        

**출력 결과:**

* 예시로 \*\*`number = 23`\*\*과 \*\*`grade = 3.99`\*\*가 있다고 가정하면, \*\*`23 3.99`\*\*라는 값이 출력되게 된다.
    

**주의사항:**

**형식 지정자의 개수**와 **변수의 개수**는 같아야 한다. 예를 들어, 두 개의 형식 지정자(`%d`와 `%f`)가 있으므로 두 개의 변수를 각각 대입해야 올바른 출력이 가능하다.

형식 지정자가 있는 위치에 해당하는 변수의 값이 대치되어 출력된다고 이해하면 된다.

---

**주의사항(Notes)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972725542/49a7a5b9-f0aa-40f0-8e2e-6c1f34fa2eac.png align="center")

위의 이미지에는 `printf()` 함수에서 형식 지정자와 변수의 자료형이 일치해야 한다는 점을 강조하고 있다.

**문제 설명:**

* 코드: `printf("%f\n", sum);`
    
    * \*\*`%f`\*\*는 실수형(double 또는 float) 데이터를 출력하기 위한 형식 지정자.
        
    * 하지만 \*\*`sum`\*\*이 **정수형 변수**일 때, 자료형이 일치하지 않아 오류가 발생하게 된다.
        

**주의 사항:**

* 형식 지정자와 출력하고자 하는 **변수의 자료형이 반드시 일치**해야 한다.
    
    * **실수형 데이터**를 출력할 때는 \*\*`%f`\*\*를 사용하고, **정수형 데이터**를 출력할 때는 \*\*`%d`\*\*를 사용해야 한다.
        

예를 들어, **정수형 변수 sum**을 출력하려면 아래와 같이 수정해야 한다.

```c
printf("%d\n", sum);  // 정수형일 때
```

또는 **실수형 sum**을 출력하려면 아래와 같이 해야 한다:

```c
printf("%f\n", sum);  // 실수형일 때
```

형식 지정자와 변수의 자료형이 일치하지 않으면 실행 시 잘못된 값이 출력되거나 프로그램이 오류를 발생시킬 수 있으니 주의해야 한다.

---

**필드폭(width)과 정밀도(precision)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726972730291/6aafb9dd-878c-4b22-a1c5-f1a4ef7ba53d.png align="center")

위의 이미지에서는 **필드 폭(width)**과 **정밀도(precision)**를 지정하여 출력 형식을 제어하는 방법을 설명하고 있다. `printf()` 함수의 형식 지정자를 사용해 출력할 때, 필드의 크기와 소수점 이하 자릿수를 제어할 수 있다.

**1\. 필드 폭 지정 (정수 출력)**

* `printf("%10d", 123);`
    
    * 출력 결과: `123`
        
    * 설명: 폭을 10으로 설정하고 오른쪽 정렬하여 정수 123을 출력한다. 남는 공간은 공백으로 채워지게 된다.
        
* `printf("%-10d", 123);`
    
    * 출력 결과: `123`
        
    * 설명: 폭을 10으로 설정하고 왼쪽 정렬하여 정수 123을 출력한다. 남는 공간은 공백으로 채워지게 된다.
        

**2\. 필드 폭과 정밀도 지정 (실수 출력)**

* `printf("%f", 1.23456789);`
    
    * 출력 결과: `1.234568`
        
    * 설명: 기본적으로 소수점 이하 6자리까지 출력된다.
        
* `printf("%10.3f", 1.23456789);`
    
    * 출력 결과: `1.235`
        
    * 설명: 필드 폭을 10으로 지정하고, 소수점 이하 3자리까지만 출력한다. 오른쪽 정렬된다.
        
* `printf("%-10.3f", 1.23456789);`
    
    * 출력 결과: `1.235`
        
    * 설명: 필드 폭을 10으로 지정하고, 소수점 이하 3자리까지만 출력하며, 왼쪽 정렬된다.
        
* `printf("%.3f", 1.23456789);`
    
    * 출력 결과: `1.235`
        
    * 설명: 소수점 이하 3자리까지만 출력하며, 필드 폭은 지정하지 않는다.
        

**요약**

* **필드 폭(width)**: 출력할 데이터의 최소 폭을 설정한다. 지정한 폭보다 데이터가 작으면 나머지는 공백으로 채워지게 된다.
    
* **정밀도(precision)**: 실수 출력 시 소수점 이하 자릿수를 설정할 수 있다.
    

이러한 설정을 통해 출력 형식을 세부적으로 조정할 수 있다.

---

**Lab: 사칙 연산**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726974882551/fb1ced27-2239-43bf-af8c-21b6496b9250.png align="center")

이미지에 있는 프로그램은 \*\*변수 `x`와 `y`\*\*에 각각 값을 저장한 후, 기본적인 사칙 연산(덧셈, 뺄셈, 곱셈, 나눗셈)을 수행하여 결과를 출력하는 예제이다.

**프로그램 설명:**

```c
/* 정수 간의 가감승제를 계산하는 프로그램 */
#include <stdio.h>

int main(void)
{
    int x;      // 첫 번째 정수를 저장할 변수
    int y;      // 두 번째 정수를 저장할 변수
    int sum, diff, mul, div;  // 두 정수 간의 연산 결과를 저장하는 변수

    x = 20;     // 변수 x에 20을 저장
    y = 10;     // 변수 y에 10을 저장

    sum = x + y;    // 변수 sum에 (x + y)의 결과를 저장
    diff = x - y;   // 변수 diff에 (x - y)의 결과를 저장
    mul = x * y;    // 변수 mul에 (x * y)의 결과를 저장
    div = x / y;    // 변수 div에 (x / y)의 결과를 저장

    // 출력 부분
    printf("두 수의 합: %d\n", sum);   // 변수 sum의 값을 화면에 출력
    printf("두 수의 차: %d\n", diff);  // 변수 diff의 값을 화면에 출력
    printf("두 수의 곱: %d\n", mul);   // 변수 mul의 값을 화면에 출력
    printf("두 수의 몫: %d\n", div);   // 변수 div의 값을 화면에 출력

    return 0;
}
```

**주요 내용:**

* **변수 선언**: `x`와 `y`는 각각 20과 10을 저장하고, `sum`, `diff`, `mul`, `div`는 각각 덧셈, 뺄셈, 곱셈, 나눗셈 결과를 저장한다.
    
* **연산**: 각 변수에 할당된 값을 바탕으로 사칙연산이 수행되며 그 결과는 다른 변수에 저장된다.
    
* **출력**: `printf()` 함수를 사용하여 결과를 출력한다.
    

**출력 예시:**

```c
두 수의 합: 30
두 수의 차: 10
두 수의 곱: 200
두 수의 몫: 2
```

이 프로그램은 기본적인 사칙 연산을 다루며, C 언어에서 변수와 연산, 출력에 대한 개념을 이해하는 데 도움이 된다.

---

# **2️⃣**입력 함수(Input function)

---

**scanf()**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977275625/52d76485-d100-4c79-922a-8870d19f8a0e.png align="center")

위의 이미지에서 설명하고 있는 `scanf()` 함수는 키보드로부터 입력된 값을 변수에 저장하기 위한 함수이다. 주요 내용을 정리하면 다음과 같다.

`scanf()` **함수의 주요 개념:**

1. **형식 지정자(format specifier)**
    
    * `"%d"`: 정수를 입력받기 위한 형식 지정자이다. 입력받을 데이터의 형식을 지정해준다.
        
2. **변수의 주소(Variable address)**
    
    * `&x`: 변수 `x`의 주소를 가리킨다. `scanf()` 함수는 값을 변수에 저장하기 위해 해당 변수의 메모리 주소를 필요로 한다.
        
    * `&`(앰퍼샌드, ampersand) 기호는 변수의 주소를 얻기 위한 연산자이다. 정수를 입력받고 이를 `x`라는 변수에 저장하려면 그 변수의 주소를 `scanf()`에 전달해야 한다.
        

**예시 코드:**

```c
int x;
scanf("%d", &x);  // 키보드로부터 정수를 입력받아 변수 x에 저장
```

**동작 과정:**

1. 프로그램이 실행되면 사용자로부터 입력을 받는다.
    
2. 사용자가 입력한 값이 **변수** `x`의 주소에 저장된다.
    

**요약:**

* `scanf()` 함수는 사용자 입력을 받아 변수를 초기화할 때 사용되며, 변수를 전달할 때는 해당 변수의 **주소**를 전달해야 한다.
    

---

**& 표시가필요한 이유**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977280623/52bd89b8-8c21-4265-9dfd-da6a600ac841.png align="center")

위 이미지에서 설명하고 있는 내용은 **변수의 주소가 필요한 이유**를 직관적으로 설명한다.

**요약:**

* **변수의 주소**는 변수를 메모리 상에서 정확히 어디에 저장할지 알려주는 정보이다.
    
* `&` 연산자는 변수가 저장된 메모리 주소를 반환한다.
    
* 이 개념을 실제 생활에 비유하면, 우리가 온라인에서 제품을 구매한 후, **배달 주소**를 제공해야 물건을 받을 수 있는 것과 유사하다. 즉, **주소만 있으면** 제품이 올바른 목적지에 배달될 수 있게 된다.
    

마찬가지로, `scanf()` 함수는 입력된 데이터를 변수에 저장하기 위해 해당 변수의 **주소**를 필요로 한다. 그 주소를 사용하여 메모리의 정확한 위치에 데이터를 저장한다.

---

**scanf()의 형식지정자 (format specifier)**

대부분 printf()와 같다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977286505/294348ee-e05d-44e7-9f11-72bfcb0f2fdf.png align="center")

💡**C 언어에서** `double`형 변수는 **실수**(소수점이 포함된 수)를 저장하기 위한 자료형이다. `double`형은 **double-precision floating-point number**를 의미하며, 이는 **부동소수점**을 보다 높은 정확도로 저장할 수 있다.

**주요 특징:**

1. **메모리 크기**:
    
    * 일반적으로 **8바이트(64비트)**를 차지하며, 이는 `float`형(4바이트)보다 더 많은 메모리를 사용한다.
        
2. **정밀도**:
    
    * `double`형은 `float`형보다 두 배 더 높은 정밀도를 가지며, 매우 큰 값이나 매우 작은 값을 더 정확하게 표현할 수 있다.
        
    * 소수점 이하 약 **15~16자리** 정도의 정확도를 가진다.
        
3. **사용 예시**:
    
    * 소수점이 포함된 숫자, 특히 높은 정밀도가 필요한 계산에서 `double`형을 사용한다.
        

**예시 코드:**

```c
cCopy code#include <stdio.h>

int main(void) {
    double a = 3.141592653589793;  // 파이 값을 double로 저장
    printf("a = %.15lf\n", a);     // 소수점 이하 15자리까지 출력

    return 0;
}
```

**출력:**

```c
a = 3.141592653589793
```

위 예시에서 `double`형 변수를 사용하여 소수점 이하 15자리까지 출력할 수 있음을 보여준다.

**결론:**

`double`형 변수는 **정밀한 실수**를 저장할 때 사용되며, `float`형보다 더 많은 소수점 자릿수를 처리할 수 있다. 과학 계산이나 금융 계산과 같은 **정확도가 중요한** 상황에서 많이 사용된다.

---

**실수 입력시 주의할 점**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977293671/166b1987-8c23-47e4-ae0e-c6c07a306bd6.png align="center")

위의 이미지에서 설명하는 내용은 **실수형 데이터를 입력받을 때 주의해야 할 점**에 대한 것이다.

**요약:**

1. **float형 변수**:
    
    * \*\*`float ratio`\*\*와 같은 **float형** 변수를 입력받을 때는 `%f` 형식 지정자를 사용한다.
        
    * 예시:
        
        ```c
        float ratio = 0.0;
        scanf("%f", &ratio);  // float형 변수는 %f 사용
        ```
        
2. **double형 변수**:
    
    * \*\*`double scale`\*\*과 같은 **double형** 변수를 입력받을 때는 `%lf` 형식 지정자를 사용.
        
    * 예시:
        
        ```c
        double scale = 0.0;
        scanf("%lf", &scale);  // double형 변수는 %lf 사용
        ```
        

**주의사항:**

* **형식 지정자**와 **자료형**이 일치하지 않으면 입력 과정에서 **오류**가 발생할 수 있다.
    
    * **float**형은 \*\*`%f`\*\*를 사용하고,
        
    * **double**형은 \*\*`%lf`\*\*를 사용해야 한다.
        

이를 정확히 사용하지 않으면 프로그램이 올바르게 작동하지 않으므로, 변수의 자료형에 맞는 형식 지정자를 사용하는 것이 매우 중요하다.

---

scanf()

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977299029/f5f5e28a-a534-441d-938c-33e4e5da568a.png align="center")

이미지에서 설명하는 `scanf()` 함수는 여러 개의 값을 입력받을 때 사용하는 예시를 보여주고있다. 주의해야할 점 2가지를 기억하자.

* **형식 지정자의 개수**와 **변수의 개수**는 일치해야 한다.
    
* 형식 지정자는 입력받을 데이터의 타입과 일치해야 한다.
    

---

**비주얼 스튜디오 2022에서 scanf()오류**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977305208/773eee0a-c3e8-4e7f-9262-e3c6aadfd8cd.png align="center")

**Visual Studio 2022**에서 발생하는 `scanf()` 함수의 오류는 Microsoft의 컴파일러가 보안성 문제로 인해 `scanf()` 대신 `scanf_s()` 함수를 권장하기 때문에 발생한다. 이와 관련된 몇 가지 중요한 사항을 요약하면 다음과 같다.

**주요 내용:**

1. **오류 내용**:
    
    * Visual Studio에서 `scanf()` 함수가 **안전하지 않으니** \*\*`scanf_s()`\*\*를 사용하라는 경고가 발생할 수 있다.
        
2. `scanf_s()` 함수:
    
    * \*\*`scanf_s()`\*\*와 같은 **\_s**가 붙은 함수들은 **C11 표준의 Annex K**에서 선택적으로 도입된 "안전한" 함수들이다.
        
    * Visual Studio와 같은 일부 컴파일러에서 지원되지만, **gcc**와 같은 다른 컴파일러에서는 이 표준을 아직 도입하지 않았거나 \*\*'유익하지 않은 표준'\*\*으로 평가되어 다음 버젼에서는 삭제될 가능성이 제기되고 있다.
        

---

**비주얼 스튜디오 2022에서의 scanf() 함수 오류 해결방법**

scanf() 사용시 컴파일 오류가 난다면?

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977312219/ad86804a-fa5f-4482-b43c-72327115cc99.png align="center")

**해결 방법**:

1. * Visual Studio에서 `scanf()` 함수의 경고를 피하면서 기존 함수들을 그대로 사용하려면, 소스 코드의 맨 첫 부분에 \*\*`_CRT_SECURE_NO_WARNINGS`\*\*를 정의해야 한다.
        
    * 이를 통해 Visual Studio의 보안 경고를 비활성화하고 기존 표준 함수를 사용할 수 있게 된다.
        

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977318027/414fec91-cb3c-4adc-8852-0e3133cd54ec.png align="center")

**주의사항:**

\*\*`_CRT_SECURE_NO_WARNINGS`\*\*는 Visual Studio의 보안 경고를 끄는 역할을 한다.

* `#define` 구문은 `stdio.h` 헤더 파일을 포함하기 전에 작성해야 한다.
    
* Visual Studio에서는 권장 사항으로 **\_s**가 붙은 함수를 사용하지만, 다른 컴파일러에서는 일반적인 `scanf()` 함수를 사용하는 것이 보편적이다.
    

이와 같이 설정하면 Visual Studio에서 기존의 표준 입력 함수인 `scanf()`를 그대로 사용할 수 있게된다.

---

**다른 방법**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977322851/1e4963f6-b032-4da6-ae64-0ecf663a2a5c.png align="center")

Visual Studio 2022에서 `scanf()` 함수와 같은 안전하지 않은 함수에 대한 경고를 비활성화하는 또 다른 방법으로, **프로젝트 속성에서 설정을 변경하는 방법**을 사용할 수 있다. 이는 코드 내에 \*\*`_CRT_SECURE_NO_WARNINGS`\*\*를 정의하지 않고도 문제를 해결할 수 있게 된다.

이 방법은 보안 경고를 끄고 프로젝트를 좀 더 간결하게 관리하는데 유용할 수 있다.

**다른 방법: Visual Studio에서 프로젝트 속성 변경  
(Alternative Method: Disabling Warnings via Visual Studio Project Settings)**

1. **프로젝트 속성으로 이동**:
    
    * 메뉴에서 **\[프로젝트\]** → \*\*\[프로젝트 속성(P)\]\*\*을 클릭한다.
        
2. **C/C++ 설정으로 이동**:
    
    * **\[C/C++\]** → \*\*\[일반\]\*\*을 선택한다.
        
3. **SDL 검사 비활성화**:
    
    * **\[SDL 검사\]** 옵션을 \*\*"아니요"\*\*로 설정한다.
        
4. **변경 사항 저장**:
    
    * 변경 사항을 저장한 후 프로젝트를 다시 빌드하면, `scanf()`와 같은 함수에 대한 보안 경고가 더 이상 발생하지 않게된다.
        

**결론:**

* 코드 내에서 \*\*`#define _CRT_SECURE_NO_WARNINGS`\*\*를 사용하는 방법이 편리할 수도 있지만, 프로젝트 설정을 변경하여 안전하지 않은 함수에 대한 경고를 끄는 것도 하나의 방법이다.
    
* 각자 상황에 맞는 방법을 선택하여 사용하면 된다.
    

---

**scanf() 정리**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726977329578/522db43c-b323-4620-8ed2-12e31d37a2b9.png align="center")

---

**수식(Expression)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726978192997/6bb13d2b-ed81-46e7-84fc-ecb174c8fe97.png align="center")

* **수식(expression)**: 수식은 **피연산자**(operand)와 **연산자**(operator)로 구성된 식을 말한다. 예를 들어, `3 + 5`는 하나의 수식이다.
    
* **수식의 결과값(the result of the expression):** 모든 수식은 **결과값**을 가진다. 예를 들어, `3 + 5`라는 수식의 결과값은 `8`이다.
    

#### 예시:

1. **산술 수식(Arithmetic expression):** `3 * (4 + 2)`는 피연산자 `3`, `4`, `2`와 산술 연산자 `*`, `+`로 구성된 수식이며, 결과값은 `18`이다.
    
2. **논리 수식(Logical expression):** `a > b`는 `a`와 `b`라는 두 피연산자와 비교 연산자 `>`로 구성된 수식이며, 결과는 `true` 또는 `false`가 된다.
    

수식은 프로그래밍에서 계산, 비교 등의 작업을 수행하는 기본적인 요소이다.

---

**변수에 값 저장하기** `x = 100`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726980521283/0ac2419f-3a6b-4e94-97cb-c53b027f3e80.png align="center")

* **대입 연산(assignment operation)**: 변수에 값을 저장하는 연산을 의미한다. 예를 들어, `x = 100`은 변수 `x`에 값 `100`을 저장하는 대입 연산다.
    
* **대입 연산 = 배정 연산 = 할당 연산(Assignment operation):** 대입 연산은 **배정 연산** 또는 **할당 연산**이라고도 불린다. 이들 용어는 모두 동일한 개념을 나타낸다.
    

#### 예시:

```c
int x;
x = 100;  // 대입 연산: 변수 x에 100을 저장
```

대입 연산자는 변수에 새로운 값을 설정하는 데 사용된다.

---

# **3️⃣**대입 연산(Assignment operation)

**다양한 대입 연산**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983484034/8e4c79c8-3073-4de7-92b7-edb73b850245.png align="center")

위의 이미지에서 설명하는 **다양한 대입 연산**의 주요 내용은 다음과 같다:

1. **변수에 값 저장**:
    
    * 변수는 `=` 기호를 사용하여 값을 저장할 수 있다.
        
    * 변수의 값은 여러 번 변경할 수 있다. 예를 들어, 처음에 `value = 10;`으로 저장된 값은 이후 `value = 20;`으로 변경될 수 있다.
        
    
    ```c
    int value;
    value = 10;  // value에 10 저장
    value = 20;  // value에 20으로 변경
    ```
    
2. **변수 간의 값 대입**:
    
    * 변수에는 다른 변수의 값도 대입할 수 있다. 예를 들어, 변수 `y`에 `x`의 값을 복사하는 경우, `y = x;`와 같이 사용할 수 있다.
        
    
    ```c
    int x = 10;
    int y = 20;
    y = x;  // y는 이제 x의 값인 10이 된다.
    ```
    

**요약:**

* 변수는 `=` 연산자를 통해 값을 저장하거나 다른 변수의 값을 대입받을 수 있다.
    
* 위 예시에서는 `x`에 저장된 값 `10`이 `y`로 복사되어 `y`의 값도 `10`이 된다.
    

---

# **4️⃣** 산술 연산 (Arithmetic operation)

**산술 연산**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726980552123/4b1af2de-865d-4c64-ac7a-f2d51b839a9a.png align="center")

**산술 연산자**는 일반적으로 수학에서 사용하는 연산 기호와 유사하며, 숫자 값을 계산하는 데 사용된다. 그 결과를 변수에 저장할 수 있다.

---

**산술 연산 #2**

![Uploaded image](https://files.oaiusercontent.com/file-vlQ3yChYFvmVEbMUqXa2zYu9?se=2024-09-22T05%3A44%3A30Z&sp=r&sv=2024-08-04&sr=b&rscc=max-age%3D299%2C%20immutable%2C%20private&rscd=attachment%3B%20filename%3Dimage.png&sig=3oQ9tZD79MccBodwfZpQJ/w0jpKUIUuqPwFbTDZ5Oe4%3D align="left")

이미지에서 설명하는 **산술 연산**의 예시는 두 변수 `x`와 `y`의 값을 더하여 `sum` 변수에 저장하는 과정을 보여주고 있다.

**설명:**

* **코드**: `sum = x + y;`
    
    * 변수 `x`와 `y`에 각각 **100**과 **200**이 저장되어 있다.
        
    * `+` 연산자를 사용하여 `x`와 `y`의 값을 더한 결과 **300**이 되고, 이 값이 `sum` 변수에 저장된다.
        

**연산 과정:**

1. \*\*`x`\*\*의 값은 **100**, \*\*`y`\*\*의 값은 **200**이다.
    
2. `x + y`는 **100 + 200**이므로, 그 결과는 **300**이 된다.
    
3. \*\*`sum`\*\*에 **300**이 저장된다.
    

**요약:**

* **산술 연산**에서 `+` 연산자는 덧셈을 수행하며, 두 값의 합이 `sum` 변수에 대입된다.
    
* 이 예시에서는 `x = 100`, `y = 200`일 때 `sum = 300`이 된다.
    

---

**정리**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726980568227/0147878f-a5fc-47dc-86da-37a28ae6657a.png align="center")

이미지에는 **두 정수를 입력받아 더한 값을 출력하는 프로그램**의 흐름을 보여주고 있다.

**프로그램 흐름 설명:**

1. **Start**: 프로그램이 시작된다.
    
2. **read x**: 사용자로부터 첫 번째 정수 \*\*`x`\*\*를 입력받는다.
    
3. **read y**: 사용자로부터 두 번째 정수 \*\*`y`\*\*를 입력받는다.
    
4. **sum = x + y**: 입력받은 두 값 \*\*`x`\*\*와 \*\*`y`\*\*를 더하여 `sum` 변수에 저장한다.
    
5. **print sum**: 계산된 \*\*`sum`\*\*의 값을 화면에 출력한다.
    
6. **End**: 프로그램이 종료된다.
    

**프로그램 코드 with scanf():**

```c
#include <stdio.h>

int main(void)
{
    int x, y;

    scanf("%d", &x);  // 사용자로부터 정수 x 입력받기
    scanf("%d", &y);  // 사용자로부터 정수 y 입력받기

    int sum = x + y;  // 두 값을 더하여 sum에 저장

    printf("%d", sum);  // sum 값을 출력

    return 0;
}
```

**설명:**

* `scanf("%d", &x);`: 사용자로부터 정수 \*\*`x`\*\*를 입력받는다.
    
* `scanf("%d", &y);`: 사용자로부터 정수 \*\*`y`\*\*를 입력받는다.
    
* `sum = x + y;`: `x`와 `y`를 더한 값을 `sum`에 저장한다.
    
* `printf("%d", sum);`: 계산된 \*\*`sum`\*\*의 값을 출력한다.
    

위 프로그램은 두 정수를 입력받아 그 합을 계산하고 출력하는 매우 기본적인 프로그램이다.

---

**덧셈 프로그램 #2**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983591083/0946d1af-46b3-4eca-9ef9-16d673e512de.png align="center")

```c
#include <stdio.h>

int main(void)
{
    int x;
    int y;

    printf("첫번째 숫자를 입력하시오: ");   // 사용자에게 입력 안내
    scanf("%d", &x);  // 사용자로부터 정수 x 입력받기
    printf("두번째 숫자를 입력하시오: "); // 사용자에게 입력 안내
    scanf("%d", &y);  // 사용자로부터 정수 y 입력받기

    int sum = x + y;  // 두 값을 더하여 sum에 저장

//입력된 값 출력
    printf("첫번째 숫자%d\n", x); 
    printf("두번째 숫자%d\n", y);
    printf("두수의 합:%d", sum);

    return 0;
}
```

**알고리즘**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983601135/77204b0a-760b-4d58-ac10-967e4f0e5887.png align="center")

**원의 면적 계산 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983622262/ca3af3c5-0fa0-4fea-a57b-4079777a53c7.png align="center")

```c
#include <stdio.h>

int main(void)
{
    float x;

    printf("원의 반지름을 입력하시오 ");   // 사용자에게 입력 안내
    scanf("%f", &x);  // 사용자로부터 반지름 길이 입력받기

    float sum = x * x;  // 두 값을 곱하여 반지름 제곱
    float pie = sum * 3.14;

//입력된 값 출력
    printf("원의 반지름%f\n", x); 
    printf("반지름 제곱%f\n", sum);
    printf("원의 면적:%f", pie);

    return 0;
}
```

**환율 계산 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983637793/772d2df2-e672-4086-a46c-822c6318ef4e.png align="center")

```c
#include <stdio.h>

int main(void)
{
    double krw;
    double aud;
    float sum;

    printf("환율을 입력하세요.");   // 사용자에게 입력 안내
    scanf("%lf", &x);  // 사용자로부터 호주 환율 입력 받기

    printf("원화 금액을 입력하세요.");   // 사용자에게 입력 안내
    scanf("%lf", &y);  // 사용자로부터 환전할 금액 입력받기

    float sum = krw / aud;  // 환전 받기


//입력된 값 출력
    printf("원화%lf원은 %f입니다.", krw, sum); 

    return 0;
}
```

---

**평균 계산하기 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726993222976/c23b6810-8dab-450d-99f1-f165c4a68f4f.png align="center")

```c
#include <stdio.h>

int main(void)
{
    double x,y,z;

    printf("3개의 과목의 각각 점수를 입력하세요 ");   // 사용자에게 입력 안내
    scanf("%lf", &x,y,z);  // 사용자로부터 각 점수 입력 받기

    double sum = x + y + z;  // 각 점수 더하기
    double ave = sum / 3; // 더한 점수를 3으로 나누기기

//입력된 값 출력
    printf("3개의 과목의 평균은 %lf입니다.", ave); 

    return 0;
}
```

💡오류 발생: 40,50,60으로 입력시 평균이 50이 아닌 13.333으로 나온다.

💡**해결방법:**

위의 코드에서 몇 가지 수정이 필요하다. 주요 문제는 `scanf()` 함수 사용 방법과 형식 지정자에 있다. `scanf()` 함수에서 여러 값을 입력받을 때는 각각의 변수에 대해 **주소 연산자(&)**를 명시해줘야 한다.

**수정된 코드:**

```c
#include <stdio.h>

int main(void)
{
    double x,y,z;

    printf("3개의 과목의 각각 점수를 입력하세요. 3개의 점수는 공백으로 구분해주세요. ");   // 사용자에게 입력 안내
    scanf("%lf %lf %lf", &x,&y,&z);  // 사용자로부터 각 점수 입력 받기

    double sum = x + y + z;  // 각 점수 더하기
    double ave = sum / 3; // 더한 점수를 3으로 나누기기

//입력된 값 출력
    printf("3개의 과목의 평균은 %.2lf입니다.", ave); 

    return 0;
}
```

**문제점 및 수정 사항:**

1. `scanf()` 함수의 문제:
    
    * 원래 코드에서 `scanf("%lf", &x, y, z);` 부분은 `&` 연산자가 `x`에만 붙어 있다. 따라서 `y`와 `z`에 대해 입력받지 못한다.
        
    * 해결책: `scanf()` 함수에서 여러 개의 실수(double)를 입력받을 때, **각 변수에 대해** `&`를 명시해야 한다. 수정된 부분: `scanf("%lf %lf %lf", &x, &y, &z);`
        
2. **형식 지정자**:
    
    * `printf()`에서 `ave` 값을 출력할 때, 소수점 이하를 **2자리**로 제한하기 위해 `%.2lf` 형식 지정자를 사용했다.
        

**실행 결과 예시:**

입력:

```c
3개의 과목의 각각 점수를 입력하세요: 40 50 60
```

출력:

```c
3개의 과목의 평균은 50.00입니다.
```

이제 코드가 올바르게 작동하며, 평균을 정확하게 계산하여 출력할 수 있다.

---

**Mini Project: 사각형의 둘레와 면적**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726983665452/4ef4ce87-d64d-4c31-a28e-d9b88e07f260.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726994188846/c367af59-3f09-4861-925d-5f4caecc65aa.png align="center")

---
