2017-03-21 1 views
-3

이 질문을 어딘가에서 발견했으며 이해할 수 없습니다. 이걸 도와주세요.C에서 비정상적인 수학 연산

#include<stdio.h> 

    int main(){ 

    char x = 250; 

    int ans = x + !x + ~x + ++x; 

    printf("%d", ans); 


} 

출력이 -6이됩니다. 나는 컴파일러가 어떻게 동작하는지 이해하지 못한다.

미리 감사드립니다.

+1

'char'가 서명 된 경우 '250'이 범위를 벗어 났지만 '-6'이 될 수 있습니다. 그러나 시퀀스 포인트가없는'++ x'는 그것을 정의되지 않은 행동으로 만듭니다. –

답변

0

이와 같은 것을 이해하려고 할 때 문제를 더 작은 부분으로 나누고 각각을 살펴 보는 것이 도움이됩니다.

#include<stdio.h> 

int main(){ 

    char x = 250; 

    printf("x: %d\n", x); 
    printf("!x: %d\n", !x); 
    printf("~x: %d\n", ~x); 
    printf("++x: %d\n", ++x); 

    int ans = x + !x + ~x + ++x; 

    printf("ans: %d\n", ans); 
} 

내가 얻을 출력 내가 그것을 실행할 수 있습니다 : :

x: -6 
!x: 0 
~x: 5 
++x: -5 
ans: -5 

당신이 무엇을 각 부분이 의미하는 것은, 그것을보고 쉽게 이해하면이 각각의 값을 출력하도록 나는 당신의 프로그램을 수정 최종 결과에 결합하는 방법. 그러나 ++x은 다른 곳에서 x을 사용하는 동일한 식의 x을 수정하고 조건이 평가되는 순서를 변경하면 최종 결과가 변경되므로 내 컴파일러도 경고 메시지를 표시합니다.

+1

이 조언이 도움이 되더라도 답변을 통해 작업 조합이 정의 된 동작을 설명한다는 인상을줍니다. 그것은 (적어도 불규칙하게 결합 된 경우에는) 그렇지 않습니다. – byxor