2017-09-10 10 views
2

그래서이 C++ 테스트가 있는데 선생님은 코드에서 숫자를 직접 사용하는 대신 상수를 선언하는 것이 정말 어렵습니다. 아래의 예제에서 나는 ZERO를 상수로 선언했습니다.코드 내에서 상수 선언 또는 숫자 사용

이 작업이 불필요한 작업인가요? 이 방법은 더 많은 메모리를 차지하거나 코드를 "느리게"만드나요?

int main() { 

    int kmStart, kmEnd; 
    const int ZERO = 0; 

    cout << "Starting Kms? "; 
    cin >> kmStart; 

    cout << "Ending Kms? "; 
    cin >> kmEnd; 

    while (kmStart < ZERO || kmStart > kmEnd) { 
     cout << "Invalid Input!" << endl << endl; 

     cout << "Starting Kms? "; 
     cin >> kmStart; 

     cout << "Ending Kms? "; 
     cin >> kmEnd; 
    } 

} 
+1

상수가 해결 및 컴파일시에 최적화됩니다. 런타임시 추가 메모리를 사용하거나 성능을 저하시키지 않습니다. – user0042

+1

물론 이것은 불필요합니다! 그것은 상수가있는 것이 아닙니다! 사실, Bathshebas 대답에서 볼 수 있듯이, 이것은 실제로 더 큰 프로그램에서 상처를 줄 수 있습니다! –

+2

상수가 'ZERO'인 것은 상수 인 'FORTY_FIVE'와 같습니다. 리터럴 값'45'을 입력하는 것과 다르지 않습니다. 상수를 사용하여 목적을 설명하는 특정 값이 아닌 것을 나타냅니다. – Galik

답변

5

constexpr int ZERO = 0; 거의 확실하게 컴파일됩니다.

C++ 11 이후의 새로운 키워드 constexpr에 주목하십시오.

현재 코드의 경우 ZERO을 컴파일 할 수 있지만 성능 저하가없는 경우에도 무시할 수 있습니다. 입력/출력 기능.

선생님이 0보다 명확한 이유가 궁금합니다. 누구나 그들이 0을 볼 때 상대하고있는 것을 압니다. 예를 들어 ZERO'0'을 의미 할 수도 있고 심지어는 "0"을 완전히 다른 짐승이라고 할 수도 있습니다. 디버깅 할 때 항상 코드를 다시 확인해야합니다.

+0

예를 들어 방정식에서 10을 나누거나 더하는 경우 10과 같은 다른 숫자를 다룰 때 무엇을 할 것입니까? –

+0

글쎄, 10 개를 사용하고있다.최소한 나는 int 형의 문자 그대로라는 것을 즉시 알 수 있습니다. – Bathsheba

+0

@FredrikBurmester : ** ** **에 따라 다릅니다. 예를 들어, 10 진수를 2 진수로 변환 할 때 10이 분명합니다. 그러나 10이 어떤 가치에 대한 추측 일 때 이름을 지어주십시오. 일반적으로 코드의 목적은 주로 사람과 의사 소통하는 것임을 기억하십시오. 주어진 구체적인 경우에 10이 귀하에게 전달하는 내용을 자문 해보십시오. 그것이 명확하지 않은 경우 이름을 지정하십시오. –

2

일반적으로 코드에 숫자 대신 정수를 사용하면 코드를 더 읽기 쉽고 유지 관리하기가 쉽습니다.

예를 들어 당신이 0.1 초 시간 단계로 시뮬레이션의 어떤 종류가 있고 다음은

을 사용하기가 더 쉬울 수있다, 소스 코드의 다른 위치에있는이 시간 단계 값이 필요합니다

는 다음과 같은 예를 생각해

const double timesstep = 0.1 

대신 0.1을 씁니다.

의 장점은 다음과 같습니다

  • 한 줄을 변경해야합니다 당신이 타임 스텝의 값을 변경하려는 경우

을 의미하는 상수를 알고있는 경우 코드가 더 읽기된다 하지만 귀하의 경우에는 0 대신 0을 사용하는 것이 더 읽기 쉽거나 "least_start"또는 그와 비슷한 표현으로 바꿀 수 있습니다.

+1

나는 이것이 중요하지 않다는 것을 알고 있지만, 0.1의 연속적인 증분은 부동 소수점 메리 지옥과 같다는 것을주의하십시오. 't = T * step/steps'과 같은 것을 사용하는 것이 더 낫습니다. – Bathsheba

+0

이것은 마법의 숫자 대신에 constans를 사용해야하는 예입니다. 실세계의 예를 들자면 문제에 따라 timestep, timepoint, timedelta 등을 정의하는 방법이 달라집니다. – Hatatister

3

수명이 긴 응용 프로그램을 개발하려면 적절하게 명명 된 상수를 사용해야합니다. 평범한 숫자 리터럴을 빠르게 관리하면 손쉽게 처리 할 수 ​​있습니다.

foo(42); 
bar(42); 

그것은이 몇 가지 문제 :

  • 이 불가능하다 추측 (42) 값이 두 기능이 호출에 42 여부를 추측 할 수 없습니다
  • 에서 온 다음 예를 살펴 보겠습니다 단지 우연의 일치 또는 의도적으로 동일한 값을 전달하는 것입니다. 이전의 포인트 변경으로 인해 프로그램 동작이 바뀌는 결과로 인해 동일한 값을 의도적으로 전달합니다. 우리가 직접 특정 값을 가진 모든 장소를 수동으로 식별해야하기 때문에 도전적 일 수 있습니다. 조정하려는 경우

응용 프로그램이 수백 개의 파일로 구성되어 있으면 문자 그대로의 악몽이됩니다.

그래서 상수는 예제 코드 조각

constexpr int const fast_foobing_rate{42}; 
constexpr int const slow_barring_coeff{42}; 

foo(fast_foobing_rate); 
bar(slow_barring_coeff); 

또는

constexpr int const days_in_week_count{7}; 
constexpr int const frobbing_weeks_count{6}; 
inline constexpr int get_frob_repetitions_count(void) noexcept 
{ 
    return(days_in_week_count * frobbing_weeks_count); 
} 

foo(get_frob_repetitions_count()); 
bar(get_frob_repetitions_count()); 

그래서 지금 될 수 있습니다 대신 사용하는 경우 : 우리가 값 의 기원을 추적 할 수 있습니다

  • 우리는 이러한 영구적 인 값 ar 전자는 우리가 쉽게 자신의 정의를 수정하여 이러한 지속적인 값을 조정할 수 있으며, 우리의 변경 사항이 자동으로 전체 코드베이스

에 걸쳐 적용됩니다 그리고이 모든 혜택을 우리가 성능 저하로 고통되지 않습니다

  • 을 사용했다. 상수 유형에 따라 성능면에서도 몇 가지 이점이 있습니다.

  • 0

    PERSONNALY, 정수 상수를 위해 내가 사용하고 열거 (소스 == 스콧 마이어, 효과적인 C++) :

    int main (int argc, char* argv []) { 
        enum Constant { 
        NTRY = 32, 
        NEQ = 8, 
        SMAX = 200000000, 
        ALERT = 65536 
        }; 
    
        size_t ntry (Constant::NTRY); 
        std::cout << "ntry == " << ntry << std::endl; 
        return 0; 
    }