2013-09-29 2 views
2

, 비주얼 스튜디오에서 동일 ++ C의 연산자는 C++ 2010 http://msdn.microsoft.com/en-us/library/x04xhy0h.aspx
그러나, 다음과 같은보고 빌드 :연산자가 C++에서 작동하지 않는 이유 - CLI? 마이크로 소프트에 따르면

int^ number = 32; 

if (number < 100) 
    MessageBox::Show("The number is not greater than 100"); 

이 빌드가 '<을'실패 '시스템 :: INT32을^< = '이 운영자 또는 빌드 실패

if (number <= 100) 
    MessageBox::Show("The number is not greater than 100"); 

미리 정의 된 연산자를 수용 할 수있는 형태로 변환을 정의하지 않는다' 'SYSTE m :: Int32^'에서이 연산자 또는 미리 정의 된 연산자에서 허용되는 형식으로의 변환을 정의하지 않습니다.

if (number == 32) 
    MessageBox::Show("The is equal to 32"); 

빌드 성공 ... 그러나 메시지가 표시되지 않습니다.

if (number = 32) 
    MessageBox::Show("The is equal to 32"); 

빌드 성공. 메시지가 표시됩니다. (왜? 평등의 연산자는 ==)

왜 이런 일이 일어나는가?

답변

2

int^handle to an object을 선언합니다. number을 직접 참조 할 때마다 실제로 박스형 정수를 참조합니다 (C#에서는 (object)32과 다소 비슷 함).

또한

리터럴 정수 비교할 때 < 또는 <= (또는 > 또는 >=) 연산자를 정의하지 오브젝트 핸들. 그 이유는 다음에서 공제 될 수 있습니다.

그러나 연산자는 ==입니다. 참조가 같은 경우 비교 확인할 것

object number = 32; 
if (number == (object)32) 
    MessageBox.Show("The number is equal to 32"); 

:하지만 비교하기 위해, 당신이 비교하고있는 리터럴 값은 암시 적으로이 C# 코드에 해당 비교를 (약간) 만들기, 박스 될 것입니다. 그들은 그렇지 않습니다 - 그들은 두 개의 다른 대상입니다. 따라서 :

int^ number = 32; 
if (number == 32) 
    MessageBox::Show("The number is equal to 32"); // isn't displayed 

은 ... 당신이 오히려 값보다 참조를 비교하고 있기 때문에, >, >=, <=, <는 거의 의미를 만들 것입니다. 그것은, 그래서 메시지가 표시됩니다 - 마지막 경우

, 당신은 (자체 32 인) 그 표현의 결과는 0과 다른 경우 다음 검사 number32를 할당하고 있습니다. 그게 if이 C++ (및 C)에서 - C#에서 number = 32의 결과가 32인데 부울 값이 필요한 if 때문에 컴파일러 오류가 발생합니다.

"솔루션"int^ 역 참조 :

if (*number == 32) 
    MessageBox::Show("The number is equal to 32"); 

...또는 단순히 int를 사용

int number = 32; 

편집 : 벤 보이트의 더 정확한 설명에 따라 재 작성.

+0

.net은 참조 유형의 핸들 ...에 대한 연산자를 정의합니다. 그러나 이것은 가치 유형이며, 아무 것도 처리 할 이유가 없습니다. –

+1

그리고 주소를 32와 비교하지 않습니다 ... 32가 boxed 된 다음 두 개의 boxed int는 참조 ID를 확인합니다. 이는 항상 false입니다. –

+0

@BenVoigt - interesting ... C++과 .NET을 잘 알고 있지만 C++/CLI에 능숙하지 않다는 것을 인정합니다. 그래서 위의 주장을 실제로 테스트하고 'number'를 찾은 정수 주소와 비교했습니다. 검사 (예 :'number == 0x1234abcd')에 의해'true '가 나타납니다. 일부 감독해야합니다. – JimmiTh

관련 문제