2009-05-13 3 views
2

Win32 gui 코드를 볼 때 대개 이것을 보게됩니다. 내 가정은 그것이 비트 또는 비트 표준이지만, 나는 또한 occasionaly C#에서 그것을 볼 수 있으며 거기에 같은 일을 더 나은 (잘 높은 수준의) 방법이있을 것 같습니다.| 함수 호출에서 연산자 의미? [C++]

MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 

감사합니다,

시머

답변

17

| 비트 OR입니다. MB_OK와 MB_ICONEXCLAMATION은 2의 거듭 제곱 (32 또는 128)으로 정의 된 상수이기 때문에 비트 OR은 이들을 결합 할 수 있습니다 (128 | 32는 2 비트가 설정된 160입니다). 비트가 플래그로 사용될 때 이것은 정상입니다.

+5

함수 호출과 관련이 없으며 모든 곳에서 똑같은 방식으로 작동합니다. –

5

그것은 다른 장소 같은 비트 OR 연산자입니다 : 어쨌든, 여기에 예입니다. 기본적으로이 기술은 상호 배타적이지 않은 일부 속성을 설정하려는 경우에 사용됩니다.

기능은 쉽게이 같은 일부 코드를 확인할 수 있습니다

if (arg & MB_ICONEXCLAMATION) { // Show an exclamation icon... 

} 

// ... 

if (arg & MB_OK) { // Show an OK button 

} 
+0

그래서 이것은 0001 및 0010과 같은 플래그를 결합하여 hackish (?) 가변 인수 함수 호출을 위해 생성합니다. –

+0

Windows API에서 일반적인 기술입니다. 그래 맞아. –

+0

* nix 시스템 호출을 포함하여 많은 장소에서 공통된 기술입니다. 예를 들어 open()의 모드와 플래그를 살펴보십시오. 긴 매개 변수를 사용하여 API의 세부 정보를 제어하는 ​​데 최대 32 개의 플래그 컬렉션을 전달하면 스택을 효율적으로 사용할 수 있습니다. 사용자 공간에서 시스템 호출에 필요한 시스템 공간까지의 썽크를 당신이 상상할 수있는보다 정교한 방법. – RBerteig

0

그것은 비트를 수행하거나.

int x = 5 | 삼; // x == 7 now

+0

아니요, 5의 이진수는 101이고 3의 이진수는 011이므로 5 | 3은 이진수 111 또는 7입니다. –

+0

수학을 확인해야한다고 생각합니다. 5 | 3은 7입니다. (101) _2 | (011) _2 = (111) _2 – Welbog

+1

Ahh 바이너리 헤드가 아프다 ... –

12

비트 마스크 용입니다. 이 믿을 수 없을만큼 사소한 예를 사용할 수 있습니다. 다음 값을 사용하여 색상의 2 진 값을가집니다.

100 = BLUE

010 = RED

001 = GREEN

이 된 SomeFuncion 말할 때 (BLUE | RED | GREEN)를; 당신은 실제로 가치가 111을 통과하고 있으며, 그 다음에는 BLUE와 RED 그리고 GREEN으로 해석 될 수 있습니다.

자세한 내용은 Google Bitwise 연산자를 참조하십시오.

+0

고마워. 내가 좀 더 생각해 봤다면, 그게 전부라는 것을 깨달았을거야. 하지만 스택 오버플로 (stack overflow)에 대해 내가 생각 하느냐고 묻는 것이 결코 아프지 않습니다. 감사! –

+1

문제가 없습니다. 더 잘 지내고 아무것도 배우지 않는 것이 좋을 것입니다. 그것은 Win32와 MFC 전반에 흩어져있는 것들 중 하나입니다. 그러나 그것이 작동하는 방법을 멈추고 생각할 때까지 그것은 마법 일 수도 있습니다. :) – Serapth

+0

그래도이 "마스킹"입니까? "바이너리 마스크 적용"에서처럼 "마스킹"과 &를 연관시킵니다. – unwind

2

MB_ICONEXCLAMATION 및 MB_OK를 "옵션"으로 생각하고 int보다 더 멋진 것은 아닙니다. 당신이 신경 쓰는 것은 그 int의 비트 표현입니다.

말 :

//MessageBox.cs or whatever 
public static int MB_ICONEXCLAMATION = 0x1 // 0001 in binary 
public static int MB_OK = 0x2 // 0010 in binary 

당신하거나 함께, 당신은 이진 0011을 얻을 때. 따라서 더 많은 인수를 갖지 않고 하나의 인수 만 사용하여 MessageBox에 대한 두 가지 옵션을 지정하려고합니다. 각 옵션에 대해 하나씩 지정해야합니다.