2010-08-20 5 views
8

DoC 조건문은 항상 [1 또는 0]을 반환하거나 [0 또는 '0 이외의 다른 값]을 반환합니다. 물어 이유는C 조건문은 항상 1 또는 0을 반환합니까?

의사 코드 -

foo는 (주소, shouldSend) :
레지스터 >> = 1 개
레지스터 < < = 1 // 첫 번째 위치
레지스터에 비트를 지우려면 | = shouldSend // 신호를 보낼지 여부를 알려주려면

누군가가 1보다 큰 true의 shouldSend 값을 전달하면 문제가 발생합니다 (단 0은 false이고 다른 모든 것은 true, 기술적으로 이것은 유효합니다). 나는 shouldSend의 진리 값을 레지스터와 직접 ORing하기 때문에 0xFF라고하지 않는 것이 좋습니다! 나는 이미 해결책을 가지고있다. 그래서 질문은 호기심을 불러 일으킨다. 궁금하지만 경우 :

foo는 (주소, shouldSend) :
레지스터 >> = 1 개
레지스터 < < = 1 // 첫 번째 위치에
레지스터 비트를 지우려면 | = (shouldSend> 0) // 보내야하는지 여부를 알리기 위해

가 문제를 해결합니까? 이제는 0xFF (또는 일반적으로 1보다 큰 값)의 문제가 C 조건에 의해 가려 졌다고 생각할 것입니다. 그러나 이는 IF C 조건문이 [0 또는 1]을 반환하도록 보장 된 경우에만 유지됩니다.

ps - 컴파일러에 따라 다르다는 것을 알고 있지만, ansi 표준은 이것에 대해 무엇을 말하고 있습니까?

+0

should should be (shouldSend! = 0)? !! shouldSend는 악의 속임수입니다! –

답변

16

표준 결과가 정수 값은 항상 0 또는 1

6.5.8 관계 연산자

각 연산자보다 < (미만)> (보다 일치 한 것을 지정)보다 작거나 같으면 관계가 true이면 1을, 거짓이면 0을 반환합니다. 결과에 int를 입력하십시오.

+0

+1, 실제로 행동을 지정한다는 것은 놀라운 일입니다. 시간이 지남에 따라 사양이 "0을 반환하거나 주사위를 임의로 굴림"이라고 말할 가능성이 높습니다. – JaredPar

+0

그래,이 표준은 완벽하게 분명합니다. –

+1

이것은 똑같은 진리 값을 가지고 있지만 정확히 0이나 1이되도록 보장 된 표준 :'!! somevalue'이 있기 전에 제가 사용 해왔던 관용구로 연결됩니다. – RBerteig

1

지정되어 있는지 여부는 중요하지 않습니다. false에 대해 항상 테스트하고 or-equals 값에 대해 명시하는 것이 가장 좋습니다. 이렇게하면 컴파일러 구현에 대한 걱정을 없애고 더 명확하고 유지 관리가 가능합니다. 오른쪽 이동 및 취소 다시 이동 왼쪽보다는

+0

그건 사실입니다. &와 |를 사용하십시오. 연산자는 단락없이 논리 연산자로 사용됩니다. – Spidey

1

의 LSB, 내가 내지 0xFE와 함께 비트 AND 한 것 :

register = register & 0xFE; 

[편집 : 가정 레지스터는 8 비트입니다. 그렇지 않다면, 필요시 오른쪽 피연산자를 적용하십시오.]

그렇습니다. shouldSend가 조건 테스트의 결과 일 경우, 표준에 의해 0 또는 1이 보장됩니다.의심의 여지가 shouldSend 다른 곳에서 생성 될 수 있는지 여부에 대해이 있다면 예

register = register | (shouldSend ? 1 : 0); 
+1

똑같은 진리 값을 가지고 있지만 정확히 0이나 1이되도록 보장 된 표준 :'!! somevalue'가 있기 전부터 사용 된 관용구입니다. – RBerteig

+0

@RBerteig : Nice! – Vicky

0

처럼 당신이 예방 조치, 또는 무언가의 종류에 넣어 것이 현명 할 것입니다. 이것은 C99에서 보장됩니다. 나는 C89 명세를 가지고 있지 않다. 물론 컴파일러 구현자는 때때로 YMMV를 실수로 범하는 것으로 알려져 있습니다.

C99은 6.5.8 관계 연산자 문단 6 다음 지정,

연산자 < (미만)의 각 > (이상) = < (보다 작거나 같음) > = (보다 크거나 같음)은 지정된 관계가 참이면 1을, 거짓이면 0을 반환합니다.

동일 또는 유사한 절

6.5.9 는 항등 연산자, 6.5.13 논리적 AND 연산자 및 제 3의 6.5.14 논리 OR 연산자 3 항의 제 3 항에 나타난다.

+0

이것은 원래의 K & R C에서 사실이었으며 종종 의존하기 때문에 표준이 따라야했습니다. – RBerteig

관련 문제