문제

2017-02-06 5 views
1

이것은 I 엔트리 수준 컴퓨터 프로그래밍 과정에서 발생한 모형 번호 : L 및 Z의문제

#include <stdio.h> 
int main() 
{ 
    int l = 20, m = 10; 
    int z; 
    z= l++ || m++; 
    printf("z = %d l = %d m = %d\n", z, l, m); 
} 

코드를 인쇄 L = 21, m = 10 및 Z = 1 개 값은 나에 의해 기대되는 것이지만, m의 가치는 저를 괴롭 히고 있습니다. 코드에 m ++가 있기 때문에 11 일 필요는 없습니다.

+0

'z = 1'이 정확한지 안다면 'm ++'이 실행되지 않은 이유를 알아낼 수 있습니다. –

답변

2

인 경우에만 m++이 실행되기 때문입니다. l++20으로 평가되므로 m++이 실행되지 않습니다. l0 인 경우 처음에는 m++이 실행됩니다.

+0

왜 단락 회로 평가에 대해 조금 설명하면 좋을지 생각합니다. –

2

식에서 l은 처음에 값을 할당하고 1을 증가시킨 후입니다. 논리합 (||)에서 동작

상기 왼쪽 피연산자 다음 오른쪽 피연산자 평가가되지 않은 비 - 제로이고, 그 결과가 참이라면. 그래서 l21이되고 m이 평가되지 않고 그 값이 10 인 이유입니다.

C 표준 (N1256 : 6.5.14 - 제 4가) 말의 : 비트 단위는 달리

| 연산자, || 운영자는 왼쪽에서 오른쪽으로 평가하는 을 보장합니다. 첫 번째 피연산자를 평가 한 후에 시퀀스 포인트가 있습니다. 첫 번째 피연산자가 과 0이 아닌 값을 비교하면 두 번째 피연산자는이 아닙니다.

+0

첫 번째로 평가된다는 뜻인가요? –

+0

@Iharob 논리 AND 연산에서는 먼저 왼쪽 피연산자 값을 확인하고, 참이면 오른쪽 피연산자 값을 확인하지 않습니다. – rsp

+0

@KeineLust 저를 제안 해 주셔서 감사합니다. – rsp

0

당신이 보는 것은 단락 회로 평가입니다. 여기

귀하의 라인 :

z= l++ || m++; 

는 말한다, 확인 리터의 값 (증가를 확인하면서). l이 0이 아니면 z를 1로 설정합니다. l이 0이면 m 값을 확인합니다 (확인하는 동안 증가시킵니다). 만약에 m이 0이 아니면 z를 1로 설정하십시오. 그렇지 않으면 z를 0으로 설정하십시오. 두 검사 중 첫 번째 검사 (l++)가 이미 true로 평가되면 시스템이 두 번째 검사를 확인할 필요가 없습니다 조건이 없으므로 m을 증가시키지 못합니다.