2014-03-04 3 views
0

다음 코드 조각이 나타났습니다.C 조건문

int main() 
{ 
    int i=1,j=2; 
    int a=i--?printf("%d",i):j--; 
    printf(" %d %d %d",i,j, a); 
    return 0; 
} 

출력은 0 0 2 1

내가 도와주세요 처음 0

제외하고 출력의 나머지 부분을 이해하는 것입니다.

감사합니다.

+0

무엇이 당신의 질문입니까? – Linuxios

+0

'i -'에 의해 1에서 0으로 변경되었습니다. – Dan

+0

오, 알겠습니다. 고마워요 :) – psyc0der

답변

2

첫 번째 0i의 값으로, 두 번째 줄에서 1으로 초기화 된 다음 초기화됩니다. 더 명시 적으로

:

  1. 후 수정 운영자 :에 사용되는 값

    i = 1 
    (i--) - evaluates as True, then sets i to 0 
    printf("%d ", i) = prints '0' 
    j-- - skipped 
    printf("%d %d %d", i, j, a) 
    print i: 0 
    print j: 2 (unchanged) 
    print a: return value of first `printf` : character count (1) 
    

    @tristopia 코멘트에서 지적했듯이, 여기에 경기에 두 개의 밀접하게 관련된 개념이있다 표현식이 이고 증분이 발생하기 전에 ...

  2. 시퀀스 포인트 : "이전 평가의 모든 부작용이 수행 된 지점"- ot에서 그녀의 말은 "우리가이 시점을 지나기 전에 일어날 필요가있는 모든 일이 일어날 것입니다." 예를 들어, 수정 후 사후 수정 된 모든 변수는 시퀀스 포인트를 전달할 때 증분 (및 저장)됩니다. 여기

의 핵심은 삼항 연산자의 ?는 시퀀스 포인트라는 것이다 - 따라서 당신이 printf 문에 도착하기 전에 i이 감소 된 것을 확신합니다. 같은 코드

명암이 :

i = 1; 
a = 5 * i++ + (i = 2 * i--); 

이 정의되지 않은 동작에 이르게 - a 또는 i의 값이 상기 후가 될 것입니다 무엇인지 확실히 말할 수있는 C 표준에 아무것도 없다. i++의 값을 언제 다시 i에 저장해야합니까? 감소 작업 전에? 우리가 결과를 i에게 할당한다는 사실은 어떨까요? 다른 "암시 적 저장소"작업 이전이나 이후에 해당합니까? 대부분의 컴파일러는 이러한 라인을 발견했을 때 경고합니다 - 특정 작업 순서가 마음에 들면 코드를 다시 작성하여 "시퀀스 포인트를 강제 실행"해야합니다.

+0

나는 내가 줄어들게된다는 것을 이해합니다. 그러나 후위 연산자를 사용하기 때문에 혼란 스러웠습니다. 그래서 내가 옳다면, 진술서가 평가되고, 그 다음에 나는 감산되어 인쇄됩니다. – psyc0der

+0

코드 조각이 추한 경우에도 정의되지 않은 동작으로 이어지는 내용은 여기에 표시되지 않습니다. –

+0

@MichaelWalz - 네 말이 맞아, 나는 더 가까이서 보았다. 그에 따라 업데이트되었습니다. – Floris

1

그럼 printf() 번을 두 번 부릅니다. 조건부 연산자의 첫 번째 값은 i (0)의 값을 인쇄합니다. 변수 a을 만들 때 기본 값은 0이었고 ii--으로 감소한 후에 0이되어 조건이 통과되었습니다.

두 번째 printf()은 다른 두 값과 함께 i을 다시 인쇄합니다.

2

i의 값은 조건 검사가 완료되기 전에 감소하지 않습니다 (후위 감소로 인해). 이 테스트는 i가 1 인 경우 true로 평가되므로 printf가 실행됩니다. 그러나 i의 테스트가 끝난 것처럼, printf가 화면에 인쇄하는 것이 감소합니다.