2014-04-30 3 views
1

이것은 성능에 대해 정말로 걱정하는 것보다 학문적 인 질문입니다. 나는 정말로 흥미 롭다. 필자는 필자의 제한된 프로그래밍 경험을 통해 컴파일러가 단지 절반의 시간 동안 영리하다는 것을 배웠다.캐스팅 값 유형 상수

나는 정적 인 클래스 인 int이 정의되어 있고 다른 정수로 그 상수를 나눌 필요가있다. 이제, 해당 부서에서 반환 된 float 값이 필요합니다. 그래서 정수로 둘 다 남겨 둘 수는 없습니다. 이제

const int CONSTANTINTEGER = 69; 
int integer = 0; 
float floatValue = 0f; 

for(integer = 0; integer < CONSTANTINTEGER; integer++) { 
    float floatValue = integer/(float)CONSTANTINTEGER; 
    //use floatValue for algorithm..... 
} 

, 내 질문 : 컴파일러는 (float)CONSTANTINTEGER 대신에 일정한 플로트를 만들 똑똑 아니면 부동 매 루프 정수를 캐스팅 하는가?

+0

루프 내에서 변수를 선언하는 것처럼 각 반복을 캐스팅하는 것처럼 보입니다. 루프 내에서 변수를 다시 작성하고 범위를 벗어나는 것처럼 보입니다. 그러나 솔직히 말해서 확실하지 않습니다. –

+2

컴파일 할 수 있습니다. ILSpy에서 컴파일 된 어셈블리를 살펴보십시오. 일리노이를 보면, 그 일을하는 곳을 볼 수 있습니다. – Amy

+0

@Amy : 아니면 캐스트가 아닌 * 어디에서 * 상수이기 때문에. 매번'integer'를'float'으로 캐스팅해야하지만,'CONSTANTINTEGER'는 그렇지 않습니다. 의견에 동의하지 않는 경우 자유롭게 자세한 내용을 적어주십시오. 더 자세히 볼 수 있습니다. –

답변

4

여기서 언어 사양이 도움이됩니다. 섹션 C# 5 사양 상태 7.19 : sbyte 바이트, 짧은 USHORT, INT, UINT 길고 ULONG, 문자 : 상수 식 널 문자 또는 다음의 타입 중 하나의 값이어야

, float, double, decimal, bool, object, string 또는 열거 형입니다. 만 다음과 같은 구조는 상수 표현식에 허용됩니다

  • ...
  • 캐스트 표현은, 대상 유형은 위의 유형 중 하나입니다 제공.

...

표현은 위의 요구 사항을 충족 할 때마다이 표현은 컴파일 시간에 평가됩니다. 표현식이 상수가 아닌 구문을 포함하는 큰 표현식의 하위 표현 인 경우에도 마찬가지입니다.

또한이 경우에있는 IL,보고이 유효성을 검사 할 수 있습니다 :

IL_000a: ldc.r4  69. 

는 나눗셈 연산을위한 제수를로드 할 때.