2011-10-30 6 views
4

나는! 0의 결과가 컴파일러에 의존한다고 언급 한 기사를 보았습니다. 결과는 1 또는 FF 또는 FFFF 등이 될 수 있습니다. C99 표준 6.5.3.3 단항 연산기로서는 C에서 논리 부정 (0) 컴파일러가 종속입니까?

,

부정 논리 연산자의 결과! 피연산자의 값이 0이 아니면 과 0이 아닌 값을 비교하면 0이되고, 피연산자의 값이 0과 비교하면 결과는 int입니다. 결과는 int입니다. ! E는 (0 == E)와 같습니다.

정말 컴파일러에 의존합니까?

+10

1로 평가되는 표준을 인용하지 않으셨습니까?! 따라서 플랫폼/컴파일러와 독립적이어야합니다. 이 기사는'~ 0'이 플랫폼에 의존적이라고 말할 수 있습니다. – Shahbaz

+0

그 기사를 어디서 보았습니까? –

답변

10

당신은을 보인다 는이 결과는, 0이나 1

해야 함을 지정 표준을 인용, 이미 당신에게 자신의 질문에 대답 한 것으로, 약 내가 추측 할 수있는 모든 당신이 요구하고 있다는 것입니다 이 점에서 모든 C 컴파일러가 표준에 부합하는지 여부. 필자는 지금까지 작성된 모든 C 컴파일러를 사용하지 않았으므로 확실하게 대답 할 수는 없습니다. 나는 결코 다른 값을 생산 한 것을 사용하거나 들어 본 적이 없다. - 그리고 유스 넷 등에서 여기에 매달려온 시간이 주어진다면, 가능성이있다. 그런 짐승이 존재한다면 나는 아마 들어 봤어.

편집 : 그것도 K & R1에서는, 구체적으로는 0 또는 1 (§A.7.2)의 제조 기술로서 주목 있다는 아마 가치 :

부정 논리 연산자의 결과! 피연산자의 값이 0이면 1, 피연산자의 값이 0이 아니면 0입니다.

1

각 컴파일러는 설명에 따라 따르는 표준 목록을 가지고 있어야합니다. 물론이 설명은 항상 사실 (일부 컴파일러는 표준의 버그 또는 오역을 포함합니다.)이지만 부울과의 동작은 너무 간단하고 오래된 것입니다 (C 첫날부터옵니다). 컴파일러는 다르게 동작합니다.

저는 공식 표준이며 사실상 표준 인 : (!0) = 1(!1) = 0인데, 모두 int 유형입니다.

그러나 C++ 부울 연산자는 bool 값을 반환하므로 C++로 컴파일하면 int가 아닌 bool이 사용됩니다. 그러나 bool과 int는 직접 교환 할 수 있습니다. 사실, 어떤 C++ 컴파일러는 bool x = 10;과 같이 이상한 일을하면 경고합니다.