2016-06-06 3 views
-2

이 부분은 부분을 제외하고는 알았습니다. 그래서 누군가가 내게 무슨 일이 일어나고 있는지 이해할 수 있도록 c|mask. 이게 뭐야, char|int? 이 조건부 연산의 결과는 int입니까?OR (|) oparator와 혼동 됨

int main() { 
    char c=48; 
    int i, mask=01; 
    for(i=1; i<=5; i++) 
    { 
     printf("%c", c|mask); 
     mask = mask<<1; 

    } 
    return 0; 
} 

이 코드의 작동 방식. 출력 : 12480

편집 : 나는 코드에 대해 의문의 여지가 없습니다. 나는 단지 "char가 int로 승격 됨"()에 대해 알고 싶다. 그것이 어떻게 행해지고, 왜 그럴 수 있고, 왜 그럴 수 있습니까? -thanks

+1

숯은 바이너리 또는 * * 표시 다음에 int로 추진됩니다. – CodesInChaos

+0

정확히 이해하지 못합니까? "C or operator"를 검색 할 때 구글이 보여주는 것은 무엇입니까? – Olaf

+0

왜, 어떻게 작동하는지 이해하지 못하고, 여기에서 물어 보았습니다. .. – Shark

답변

4

|을 포함하여 char과 같은 더 작은 정수 유형이 많은 작업에서 int으로 승격되지만 그 승격은 여기에서 실제로 관련이 없습니다. |binary or 연산이며, 해당 입력 비트 중 적어도 하나가 설정되면 결과의 각 비트가 설정됩니다. c|mask은 정수이지만 printf("%c"은 문자로 인쇄합니다. 이를 정수로 인쇄하려면 대신 printf("%d"을 사용하십시오. c = 48은 ASCII 숫자 '0'을 나타내고 그 뒤에 다른 숫자가옵니다.

c = 48 = 0x30 = '0' 

각 반복을 위해 그것을 평가 :

i = 1, mask = 1 = 0x01, c|mask = 0x31 = '1' 
i = 2, mask = 2 = 0x02, c|mask = 0x32 = '2' 
i = 3, mask = 4 = 0x04, c|mask = 0x34 = '4' 
i = 4, mask = 8 = 0x08, c|mask = 0x38 = '8' 
i = 5, mask = 16 = 0x10, c|mask = 0x30 = '0' (the mask bit is already set in `c`, so the result is 'c' without changes) 
+0

'마스크'의 기능은 무엇입니까? – zhenguoli

+0

@zhenguoli 단일 세트 비트는 각 반복마다 하나씩 왼쪽으로 이동하므로 1에서 16까지 2의 제곱을 취합니다. – CodesInChaos

+0

그러나 왜 'c'비트 또는 '마스크'가 루프를 가져 옵니까? 그는 마스크의 하위 4 비트를 문자로 표현하고 싶습니까? – zhenguoli