2011-12-30 6 views
5

왜 첫 번째 사람은 pbf_ [k]를 올바르게 증가시킬 수 있습니까? 반면 두 번째 사람은 pcf_ [k]를 올바르게 증가시킬 수 있습니까?이 두 C++ 코드 블록의 차이점은 무엇입니까?

unsigned pbf_[5] ={0}; 
bool m=0; 

코드 1 :

for(int k=0;k<5;k++)  
{ 

    if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)  
    pbf_[k]++; 
    } 

코드 2 : 제 단지 테스트 동안에는

for(int k=0;k<5;k++)  
{ 
    if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true) 
     pbf_[k]++; 
} 
+0

각 반복 내에서 M 값을 확인해야합니다. 차이점을 확인해야합니다. –

답변

7

첫 번째 경우 마스킹 결과는 true와 비교되기 전에 bool m으로 변환됩니다.

두 번째 경우에는 비트 마스크가 정수형이라고 생각합니다. 이 경우 true은 동일한 정수 유형으로 승격되고 값은 1입니다.

== true을 비교 결과에서 제외하면됩니다.

+3

@ John이 인식하지 못하는 경우, '&'는 논리 AND가 아닌 비트 AND이며 결과는 정수입니다. 부울 컨텍스트에서 평가 된 0이 아닌 정수는 true이지만 1 * 인 정수 *로 'true'와 같지 않습니다. –

+0

이 문제를 해결하는 또 다른 방법은 'bool'에 대한 명시 적 형변환을 사용하는 것입니다. 그러나, 이것은 '어리석은'것에 비해 어리석은 것입니다. "it is true"라는 문구가 거의 항상 영어로 불필요한 것과 같은 방식으로,'== true'는 프로그래밍에서 거의 항상 불필요합니다. –

0

첫번째는 bit_table_[k][i][bit_index ] & bit_mask[bit]의 값 m에 대입의 결과를 테스트 여부

bit_table_[k][i][bit_index ] & bit_mask[bit] 결과 없음

첫 번째 결과가 각 반복에서 m으로 기록된다는 점을 제외하면 두 동일한 결과가 나타납니다.

+1

아니오, 그들은 동일한 효과가 없으며, 두 번째 테스트에 대한 설명은 틀린 것 같습니다. 보 페슨의 대답을 참조하십시오. – Mat

0

먼저

if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true) 

변수 m에 어떤 값을 assining되어 있는지 확인하고 true의 경우 그 촬영됩니다.

0

코드에 하나의 문제점이 있습니다. & 대신 & &을 사용해야합니다. 비교해 보면 & &은 논리 연산자이며 & - 비트 연산자와 다릅니다.

예 :

(([K] m =은 (bit_table_ [I]가 [bit_index] & & bit_mask는 [비트])) == TRUE)

가 C에서 오퍼레이터에 대해 배우고 ++ 할 수 있다면

+0

아니요, 특정 비트가 두 값 모두에 설정되어 있는지 확인해야하기 때문에 비트 연산자를 원합니다. 그러나 결과를 "true"와 비교하지 말아야한다. 왜냐하면 "true"와 비교하는 것이 필요하다. 왜냐하면 "1"과 비교하는 것과 같기 때문이다. "match"에서도 다른 0이 아닌 값이 될 수있다. @ 보 퍼슨은 맞습니다. –

관련 문제