다음 코드 조각이 나타났습니다.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
제외하고 출력의 나머지 부분을 이해하는 것입니다.
감사합니다.
다음 코드 조각이 나타났습니다.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
은 i
의 값으로, 두 번째 줄에서 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 코멘트에서 지적했듯이, 여기에 경기에 두 개의 밀접하게 관련된 개념이있다 표현식이 이고 증분이 발생하기 전에 ...
의 핵심은 삼항 연산자의 ?
는 시퀀스 포인트라는 것이다 - 따라서 당신이 printf
문에 도착하기 전에 i
이 감소 된 것을 확신합니다. 같은 코드
명암이 :
i = 1;
a = 5 * i++ + (i = 2 * i--);
이 정의되지 않은 동작에 이르게 - a
또는 i
의 값이 상기 후가 될 것입니다 무엇인지 확실히 말할 수있는 C 표준에 아무것도 없다. i++
의 값을 언제 다시 i
에 저장해야합니까? 감소 작업 전에? 우리가 결과를 i
에게 할당한다는 사실은 어떨까요? 다른 "암시 적 저장소"작업 이전이나 이후에 해당합니까? 대부분의 컴파일러는 이러한 라인을 발견했을 때 경고합니다 - 특정 작업 순서가 마음에 들면 코드를 다시 작성하여 "시퀀스 포인트를 강제 실행"해야합니다.
그럼 printf()
번을 두 번 부릅니다. 조건부 연산자의 첫 번째 값은 i
(0)의 값을 인쇄합니다. 변수 a
을 만들 때 기본 값은 0이었고 i
은 i--
으로 감소한 후에 0이되어 조건이 통과되었습니다.
두 번째 printf()
은 다른 두 값과 함께 i
을 다시 인쇄합니다.
i의 값은 조건 검사가 완료되기 전에 감소하지 않습니다 (후위 감소로 인해). 이 테스트는 i가 1 인 경우 true로 평가되므로 printf가 실행됩니다. 그러나 i의 테스트가 끝난 것처럼, printf가 화면에 인쇄하는 것이 감소합니다.
무엇이 당신의 질문입니까? – Linuxios
'i -'에 의해 1에서 0으로 변경되었습니다. – Dan
오, 알겠습니다. 고마워요 :) – psyc0der