2009-11-25 8 views
2

코드에서 명명 된 상수를 사용할 때 암시 적 유형 변환을 줄이려고했습니다. 타입 변환이 일어날 필요가 없도록 예보다는표현식의 암시 적 유형 변환 double int

const double foo = 5; 

을 사용하기 위해 나는

const double foo = 5.0; 

을 사용합니다. 그러나, 내가 이런 식으로하는 표현에서 ...

const double halfFoo = foo/2; 

등 2는 정수로 평가되며 암시 적으로 변환됩니까? 대신 2.0을 사용해야합니까?

+1

이것은 C++로 태그가 지정되었으므로 질문의 예제는 매우 간단합니다. 실제 프로그램의 경우 (그리고 내장 함수를 사용하지 않을 때), 나는 정확한 타입과 명시 적 생성자의 사용을 강조한다. 모호하거나 암시적인 구성 및 변환은 찾기 어려운 버그의 원인 일뿐 아니라 성능 저하 및 일반적인 프로그램의 정확성입니다. – justin

답변

5

foo이 이중이기 때문에 2은 암시 적으로 double로 변환됩니다. foo이 정수라고하면 정수 나누기가 수행되고 결과는 halfFoo에 저장되므로주의해야합니다.

나는 항상 부동 소수점 리터럴 (사용하는 것이 좋습니다 생각 예를 들어, 당신은 그것은 더 일관성입니다. 부동 소수점 값으로 사용하기에자를 수 있습니다 치명적인 버그를 찾기 위해 당신을 도울 수 그들을 위해 의도 곳 2.0 또는 2. . 이런 종류의 최대

+0

두 번째 생각, 비교는 어떨까요? 이중을 < or > 0으로 비교하는 것? 0 또는 0.0을 사용할지 궁금합니다. – Anonymous

+0

0.0을 사용합니다. 습관을 유지하기 위해서입니다.하지만이 경우에는별로 중요하지 않습니다. –

+3

@Person : 변환은 런타임이 아닌 컴파일 타임에 발생하므로 (런타임) 성능에는 문제가 없습니다. 비교의 LHS가 float 또는 double을 생성하는 경우, 코드를 읽는 사람이 명확하게 알 수 있도록 RHS도 float 또는 double 상수 여야합니다. 그러나 컴파일러에게는 무시할 수있는 차이가 있습니다. –

1

이것은 Type Coercion로 알려져 위키 백과 그것에 대해 좋은 비트가 있습니다..,

암시 적 형식 변환, 또한 강제로 알려진 컴파일러에 의해 자동 타입 변환입니다 일부 언어는 컴파일러가 강제적으로 제공 할 수 있도록 허용하거나 심지어 요구합니다.

혼합 유형 표현식에서, 하나 이상의 부속 유형의 데이터는 런타임시 필요에 따라 상위 유형으로 변환되어 프로그램이 올바르게 실행될 수 있습니다. 의도하지 않은 결과가 발생할 수

...

이 동작은주의해서 사용해야합니다. 부동 소수점 표현이 정수 표현으로 변환 될 때 데이터가 손실 될 수 있습니다. 부동 소수점 값의 소수 구성 요소는 잘 렸습니다 (반 내림). 반대로 정수 표현에서 부동 소수점 표현으로 변환하면 부동 소수점 유형이 정수를 정확하게 표현할 수 없기 때문에 정밀도가 떨어질 수 있습니다 (예 : float은 IEEE 754 단 정밀도 유형 일 수 있습니다. 정수 16777217, 32 비트 정수형은 가능). 이것은 동일한 정수 값을 정수형의 두 변수에 저장하고 실수를 입력하면 같음을 비교하면 false를 반환하는 것과 같은 상황을 초래할 수 있습니다.

정수형 (즉, long, 정수, shorts, chars) 표현식의 값은 표현식에서 가장 큰 정수 유형입니다. 확실하지는 않지만 비슷한 점이 있다고 생각합니다 (부동 소수점 값이 정수 유형보다 "더 큽니다"라고 가정). 부동 소수점 숫자가 포함 된 표현식을 사용합니다.

3

엄밀히 말하면 달성하려는 것은 비생산적인 것으로 보입니다.

일반적으로 C 프로그램에서 명시적인 유형 변환 수를 줄이고 일반적으로 소스 코드의 모든 유형 종속성을 줄이기 위해 노력합니다. 좋은 C 코드는 가능한 한 유형에 독립적이어야합니다.이는 일반적으로 가능한 한 자주 특정 유형을 철자하는 명시적인 구문 요소를 피하는 것이 좋습니다. 후자는 중복 때문에

const double foo = 5.0; /* worse */ 

보다

const double foo = 5; /* better */ 

을하는 것이 좋습니다. C 언어의 암시 적 유형 변환 규칙은 전자가 올바르게 작동하는지 확인합니다. 비교에 대해서도 마찬가지입니다. 다시, 이전보다 유형에 독립적이기 때문에이

if (foo > 0) 

더 이상

if (foo > 0.0) 

입니다.

이 경우의 암시 적 유형 변환은 매우 좋은 것이지 나쁜 것은 아닙니다. 그것은 당신이 일반적인 타입 독립적 인 코드를 작성하는 데 도움이됩니다. 왜 그들을 피하려고합니까?

경우에 따라 2 대신 2.0 등의 형식을 명시 적으로 표현할 수밖에없는 경우도 있습니다. 그러나 일반적으로 사람은 단지 사람이 정말로해야 할 때 그것을 할 것입니다. 왜 누군가가 진짜 필요성없이 그것을 할 것이냐는 나를 넘어선 것입니다.