2010-06-01 2 views
23

Ivor Horton의 Beginning C 서적을 사용하여 약간의 C를 공부하고 돌아 왔습니다. 나는 같은 문장에서 변수들과 섞이게되는 상수를 선언하는 것에 대해 조금 알아 차렸다.프로그래밍에서 상수를 사용하는 이유는 무엇입니까?

C에서 상수와 변수를 지정할 때의 차이점을 명확히하기 위해 실제로 변수 대신 상수를 사용해야하는 경우는 언제입니까? 사람들은 프로그램 실행 중에 정보가 변경되지 않을 때 상수를 사용한다고 말하지만 변수가 대신 사용될 수없는 시간을 생각할 수는 없습니다.

+0

고정 길이 저장 : 다음 문서 중 하나를 읽을 무료 새로운 배열로 최악의 경우 복사가 작동하는 곳 –

+0

이 질문에는 단 하나의 반대 예가 필요합니다. 왜 PI를 가변으로 만드시겠습니까? –

+0

@ 한스 패전트 : Pi는 상수입니까? 지금까지 지구의 근접에서만 측정되었습니다. 시공간 연속성을 통해 일정하다는 것이 확실합니까? –

답변

29

이름에서 알 수 있듯이 변수는 시간에 따라 다릅니다. 변화가 없다면 "손실 없음"이 있습니다. 값이 변경되지 않는다고 컴파일러에 알리면 컴파일러는 값을 직접 인라인하고 스택 상에 상수를위한 공간을 할당하지 않는 등의 최적화를 수행 할 수 있습니다.

그러나 컴파일러에서 값이 설정되면 올바르게 변경되는지 정확하게 판단 할 수있는 것은 아닙니다. 컴파일러가 100 % 신뢰도로이를 결정할 수없는 상황에서는 컴파일러가 안전 측면에서 오류를 범하고 변경 될 수 있다고 가정합니다. 이로 인해 인라인을 피하고 특정 루프를 최적화하지 않고 병렬 처리에 익숙하지 않은 객체 코드를 작성하는 등 다양한 성능 영향을 미칠 수 있습니다.

가독성도 중요하므로 가능하면 명시 적 상수를 사용하고 실제로 변경할 수있는 변수는 남겨 두어야합니다.

상수 리터럴 숫자 사용하는 이유에

:

1) 그것은 코드를 읽기 수 있습니다. 3.14가 무엇인지는 누구나 알고있다. (잘하면), 모두가 3.07이 PA의 소득 세율이라는 것을 아는 것은 아니다. 이것은 도메인 별 지식의 예이며 앞으로 귀하의 코드를 관리하는 모든 사람 (예 : 세금 소프트웨어)이 알 수있는 것은 아닙니다.

2) 변경하면 작업이 저장됩니다. 장래에 세율이 바뀌면 3.07에서 3.18로 변경됩니다. 항상 변경 사항을 최소화하고 이상적으로 단일 변경을 원합니다. 보다 많은 동시 변경이 이루어질수록 무언가를 잊어 버릴 위험이 높아져 오류가 발생합니다.

3) 위험한 오류는 피하십시오. 소득 세율이 3.05 인 두 주와 그 중 하나가 3.18로 변경되고 다른 하나는 3.07로 변경된다고 상상해보십시오. 그냥 가서 바꾸면 심각한 오류가 발생할 수 있습니다. 물론 많은 정수 또는 문자열 상수 값이 "3.07"보다 일반적입니다. 예를 들어, 숫자 7은 요일의 숫자와 다른 것을 나타낼 수 있습니다. 대규모 프로그램에서는 각 리터럴 값의 의미를 파악하는 것이 매우 어렵습니다.

4) 문자열 텍스트의 경우 문자열에 기호 이름을 사용하여 여러 언어를 지원하는 경우 문자열 풀이 빨리 바뀔 수 있습니다.

변수 및 "상수 변수"외에도 열거 형 언어도 있습니다. 열거 형은 실제로 작은 상수 그룹 (예 : 반환 값)에 대한 유형을 정의 할 수 있으므로 유형을 사용하면 유형 안전성을 제공합니다.

예를 들어, 요일 및 월에 대한 열거 형이있는 경우 하루에 한 달을 지정하면 경고 메시지가 표시됩니다. 정수 상수 만 사용하면 3 일이 3 일에 할당되면 아무 경고도 표시되지 않습니다. 항상 유형 안정성이 필요하므로 가독성이 향상됩니다. 또한 열거 형은 순서를 정의하는 데 더 좋습니다. 상상해보십시오. 요일에 대한 상수가 있다고 상상해보십시오. 이제 일요일이 아닌 월요일에 주를 시작하겠습니다.

+3

OP는 리터럴에 대해 묻지 않습니다. 문제는 상황이 바뀌지 않을 때 상수를 사용하는 이유는 무엇입니까? 왜 모든 것을 위해 변수를 사용하지 않는 것입니까? 우리가 다 떨어지는 것 같지는 않습니다 ... –

+1

제 대답에 대한 첫 번째 단락에 답할 수 있습니다. 시간이 지남에 따라 변하지 않으면 변수를 사용할 필요가 없습니다. 그러나 나는 이것을 더 분명히 할 것이다. – Uri

+0

나는 또한 추가 할 것이다 : 5) 유형 안전. – matias

1

const 키워드는 종종 포인터가 가리키는 메모리가 함수에 의해 수정되지 않도록 제안하는 함수 매개 변수, 특히 포인터에 사용됩니다. 예를 들어 strcpy의 decleration 봐 :

char *strcpy(char *dest, const char *src); 

그렇지 않으면, 예를 들어,

const int my_magic_no = 54321; 

이보다 선호 될 수와 같은 선언 : 유형의 안전을 위해

#define MY_MAGIC_NO 54321 

.

+0

어, 그냥 변수 대신 상수를 사용하는 이유에 대한 문제를 실제로 해결하지 못한다는 것을 깨달았습니다. –

+0

OP가 매개 변수에 대해 묻지 않고 지역 변수에 대해 묻지 않는다고 생각합니다 ... –

+0

글쎄, Brian이 그것을 지적 해 주신 것에 대해 감사드립니다. 내가 눈치 채지 못한 것처럼 - | –

9

성능 최적화.

더 중요한 것은, 이것은 인간 독자를위한 것입니다. 타겟 고객은 컴파일러가 아니라는 것을 기억하십시오. 코드로 자신을 표현하고 주석을 피하는 데 도움이됩니다.

const int spaceTimeDimensions = 4; 

if(gpsSattelitesAvailable >= spaceTimeDimensions) 
    Good(); 
+2

OP는 실제로 상수 vs 리터럴에 대해 실제로 묻지는 않지만 ... 상수 vs 변수 ... –

+0

아직도 가독성 도구입니다. –

1

상수는 메모리를 공유하기 원할 때 변경되지 않습니다.

+3

메모리를 공유하고 싶을 때 마음이 녹습니다. 내 마음이 네 마음에 ... –

+2

마음이 녹 겠니? 그것은 모두 치즈처럼 보이고 토스트에 복무합니까? –

+0

전체적으로 변수 사용에 비해 성능이 향상됩니까? –

13

상수를 사용하는 것은 오전 2시에 코딩 할 때 또는 커피를 마실 때 실수로 코드 어딘가에서 값을 변경하는 것을 방지하기 위해 방어 프로그래밍의 한 방법입니다.

기술적으로 예, 변수를 대신 사용할 수 있습니다.

+0

2am 당신은 의미합니까? (filler) – Ponkadoodle

+3

@wallacoloo : 물론 고마워요. 그것은 12am에 대답을 쓸 때 일어나는 일입니다.:) –

+3

* sleep *은 방어 프로그래밍 전술이기도합니다. – Jackson

1

특정 클래스의 오류를 트래핑하는 것은 정말 쉬운 방법입니다. 변수 const을 선언하고 우연히 수정하려고하면 컴파일러에서 호출합니다.

6

상수에는 변수에 비해 몇 가지 장점이 있습니다.

상수는 코드가 기본 값을 변경할 수 없음을 어느 정도 보장합니다. 이는 소규모 프로젝트에서는 그리 중요하지 않지만 여러 저자가 작성한 여러 구성 요소가있는 대규모 프로젝트에서 중요합니다.

상수는 최적화를 위해 컴파일러에게 강력한 힌트를 제공합니다. 컴파일러는 값을 변경할 수 없다는 것을 알고 있기 때문에 메모리에서 값을로드 할 필요가 없으며 상수의 정확한 값에 대해서만 작업하도록 코드를 최적화 할 수 있습니다 (예 : 컴파일러에서 곱하기/나눗셈을위한 시프트 사용 가능). const가 2의 거듭 제곱 인 경우)

상수는 또한 본질적으로 정적입니다. 상수와 그 값을 헤더 파일에 선언 할 수 있으며 정확하게 한 곳을 정의하는 것에 대해 걱정할 필요가 없습니다.

+2

이러한 보장은 나중에 디버깅 및 유지 관리를 훨씬 쉽게 할 수 있습니다. 변수가있는 경우 코드를 변경하는 코드의 위치를 ​​자주 찾게됩니다. 상수라면 피할 수 있습니다. – caf

2

C와 같은 저급 언어의 경우 상수는 여러 가지 컴파일 최적화를 허용합니다.

일반적으로 프로그래밍 언어의 경우 실제로 필요하지 않습니다. 루비와 자바 스크립트와 같은 높은 수준의 동적 인 언어는 그것들을 가지고 있지 않습니다 (적어도 진정한 상식은 아닙니다). 대신 제안 된 것처럼 변수가 사용됩니다.

0

const를 사용하지 않으면 팀 프로젝트의 누군가가 int FORTY_TWO = 42을 선언하고 다른 팀원이 다른 곳의 FORTY_TWO = 41과 동일하게 만들 수 있음을 의미합니다. 그러므로 세상 끝나기도하고 삶에 대한 응답도 느슨합니다. const과는 아무런 관련이 없습니다.플러스 const은 일반 변수의 저장 공간과 비교할 때 메모리의 다른 곳에 저장되므로 더 효율적입니다.

관련 문제