<commit_before>---
layout: post
title:  "C의 지역 변수 이야기"
date:   2016-11-26
desc: "C의 지역 변수와 표준에 대한 이야기"
keywords: "c,for,index,local,variable,standard,c99,c11"
categories: [C/C++]
tags: [c]
icon: icon-c
---

## 개요

오늘 새벽에 생활코딩 페이스북 그룹에 이런 질문이 올라왔다.

> c언어 컴파일러를 dev c++로 바꿨습니다. 
> 기존 코드를 옮겨서 해봤는데 'for' loop initial declarations are only allowed in C99 or C11 mode 라는 오류가 뜨더라구요. 
> 찾아보니 for문 안에서 변수선언은 C99같은거 에서만 된다는데, C99, C11 같은게 뭔가요? 
> C언어 문법이 어떤 표준화된게 있고 변형이 되어 있는건가요? 이 단어들이 생소하진 않은데 정확하게 처음부터 설명이 나온곳이 없네요..

[원본글](https://www.facebook.com/groups/codingeverybody/1415895508450981)

오늘은 이 질문에 대한 답변을 해보려한다.

## 충격적 사실 발표

일단 첫번째로 말할 것은 사실 C에서는 도중에 변수를 선언할 수 없다.

Windows에서 Visual Studio만 사용했던 C 입문자들은 지금 대혼란이 왔을 것이다.

다음 예제를 보자.

``` c
void func()
{
    int a = 1, b = 2;
    printf("%d %d\n", a, b);

    int c = a + b;
    printf("%d\n", c);
}
```

위 코드에 문제가 있다고 말하는 사람은 아무도 없을 것이라 생각하지만 원래는 변수 c를 함수 도중에 선언했으므로 에러가 나는 문장이다.

또 다른 예제를 보자

``` c
for (int i = 0; i < 10; i++) {
    ...
}
``` 

위 코드. 변수 i를 도중에 선언했으므로 문제가 있는 코드다.

하지만 지금까지 문제없이 잘 작성했었고 잘 작동했었다.

그 이유는 바로 표준에 있다.

## 표준

C를 처음 배울 때, _"C는 데니스 리치가 만들었다."_ 정도로만 배운다.

하지만 생각해보자. 1972년에 처음 만들어진 언어가 그 때 그대로 내려올까?

그 대답은 **아니다.** 


참고로 말씀드릴께 두가지가 있는데 하나는 프로그래밍 언어는 표준이 정해지면 그 표준에 맞게 코드가 동작할 수 있도록 하는 컴파일러를 개발한다는 것입니다.

그런데 만약 표준으로 정의하지 않은 코드가 있다면 컴파일러는 그 코드를 컴파일러 마음대로 동작합니다. 그래서 어떻게 동작할 지 모르니 위험하다고 하는 것이고요. 이를 Undefined behavior라고 합니다.

두 번째는 사실 원래 C는 도중에 변수를 선언할 수 없다는 것입니다.

C는 원래 함수가 시작할 때, 사용할 변수를 모두 선언해야 합니다.
그래서 for (int i = 0; i < 10; i++) 와 같은 코드는 안되죠.

하지만 이 후에 나온 언어들이 어디에서나 변수를 선언할 수 있도록 되었고 C도 이를 따라 가기 위해 1999년에 회의를 통해 도중 변수 선언 등 기능을 추가한 C99를 표준으로 정하고 컴파일러들은 이를 구현하게 된거지요.<commit_msg>Modified a post<commit_after>---
layout: post
title:  "C의 지역 변수 이야기"
date:   2016-11-26
desc: "C의 지역 변수와 표준에 대한 이야기"
keywords: "c,for,index,local,variable,standard,c99,c11"
categories: [C/C++]
tags: [c]
icon: icon-c
---

# 개요

오늘 새벽에 생활코딩 페이스북 그룹에 이런 질문이 올라왔다.

> c언어 컴파일러를 dev c++로 바꿨습니다. 
> 기존 코드를 옮겨서 해봤는데 'for' loop initial declarations are only allowed in C99 or C11 mode 라는 오류가 뜨더라구요. 
> 찾아보니 for문 안에서 변수선언은 C99같은거 에서만 된다는데, C99, C11 같은게 뭔가요? 
> C언어 문법이 어떤 표준화된게 있고 변형이 되어 있는건가요? 이 단어들이 생소하진 않은데 정확하게 처음부터 설명이 나온곳이 없네요..

[원본글](https://www.facebook.com/groups/codingeverybody/1415895508450981)

오늘은 이 질문에 대한 답변을 해보려한다.


# 충격적 사실 발표

일단 첫번째로 말할 것은 사실 C에서는 도중에 변수를 선언할 수 없다.

Windows에서 Visual Studio만 사용했던 C 입문자들은 지금 대혼란이 왔을 것이다.

다음 예제를 보자.

``` c
void func()
{
    int a = 1, b = 2;
    printf("%d %d\n", a, b);

    int c = a + b;
    printf("%d\n", c);
}
```

위 코드에 문제가 있다고 말하는 사람은 아무도 없을 것이라 생각하지만 원래는 변수 c를 함수 도중에 선언했으므로 에러가 나는 문장이다.

또 다른 예제를 보자

``` c
for (int i = 0; i < 10; i++) {
    ...
}
``` 

위 코드. 변수 i를 도중에 선언했으므로 문제가 있는 코드다.

하지만 지금까지 문제없이 잘 작성했었고 잘 작동했었다.

그 이유는 바로 표준에 있다.


# 표준

C를 처음 배울 때, _"C는 데니스 리치가 만들었다."_ 정도로만 배운다.

하지만 생각해보자. 1972년에 처음 만들어진 언어가 그 때 그대로 내려올까?

그 대답은 **아니다.** 


**작성중**

# 내가 단 댓글

> 참고로 말씀드릴께 두가지가 있는데 하나는 프로그래밍 언어는 표준이 정해지면 그 표준에 맞게 코드가 동작할 수 있도록 하는 컴파일러를 개발한다는 것입니다.
> 그런데 만약 표준으로 정의하지 않은 코드가 있다면 컴파일러는 그 코드를 컴파일러 마음대로 동작합니다. 그래서 어떻게 동작할 지 모르니 위험하다고 하는 것이고요. 이를 Undefined behavior라고 합니다.
> 두 번째는 사실 원래 C는 도중에 변수를 선언할 수 없다는 것입니다.
> C는 원래 함수가 시작할 때, 사용할 변수를 모두 선언해야 합니다.
> 그래서 for (int i = 0; i < 10; i++) 와 같은 코드는 안되죠.
> 하지만 이 후에 나온 언어들이 어디에서나 변수를 선언할 수 있도록 되었고 C도 이를 따라 가기 위해 1999년에 회의를 통해 도중 변수 선언 등 기능을 추가한 C99를 표준으로 정하고 컴파일러들은 이를 구현하게 된거지요.
{'fraction_non_alphanumeric': 0.1016949152542373, 'fraction_numerical': 0.033303597977995834, 'mean_word_length': 2.6724890829694323, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 17, 'https://': 2, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2974043', 'n_tokens_mistral': 2819, 'n_tokens_neox': 3612, 'n_words': 653}