2014-07-04 2 views
-2
int main() 
{ 
    int c=5; 
    printf("%d\n%d\n%d", c, c<<=2, c>>=2); 
    return 0; 
} 

할당이 printf 함수에서 어떻게 일어나는지 알 수 없습니다. 출력은 4,4,4가 나오지만 나에 따르면 4,4,1이되어야합니다.printf의 작동 방식은 무엇입니까?

+0

표준에 따르면 정의되지 않은 동작입니다. 함수 인수가 왼쪽에서 오른쪽으로 평가된다는 것을 기대하는 것 같습니다. 그들은 그렇지 않을 수도 있습니다. –

+0

질문에 올바른 언어 태그를 추가해야합니다. [태그 : c] 또는 [태그 : C++] – Sayse

+0

@Sayse 이것은 C++가 아니라 C입니다. –

답변

3

c 사이에 시퀀스 포인트가 없으므로 동작이 정의되지 않습니다.

시퀀스를 명시 적으로 지정해야합니다. 예를 들면 다음과 같습니다.

int main(void) 
{ 
    int c = 5; 
    int d = c >> 2; 
    int e = d << 2; 
    printf("%d\n%d\n%d", c, e, d); 
    return 0; 
} 

컴파일러에게 경고를 요청해야합니다. 그렇게하고 컴파일러가 유능하다고 가정하면 문제를 경고합니다. 예를 들어, 내 GCC는 -Wall 옵션이 보고서를 사용하여 프로그램을 컴파일 물었을 때 : 당신은 컴파일 할 때 -Wall 플래그를 사용한다

 
main.c: In function 'main': 
main.c:6:37: warning: operation on 'c' may be undefined [-Wsequence-point] 
    printf("%d\n%d\n%d", c, c<<=2, c>>=2); 
            ^
main.c:6:37: warning: operation on 'c' may be undefined [-Wsequence-point] 
1

.

내가 가지고 : 예를 들어

../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point] 
../main.c:6:37: warning: operation on ‘c’ may be undefined [-Wsequence-point] 

이 코드가 파손되어

c<<=2

c의 수정 사항 사이에 순서 지점이 없기 때문에. 그 결과

int a = c << 2;

, 코드가 정의되지 않은 동작에 이르게 :

그것은이 같은해야한다.

+0

@Deduplicator 다른 답변에서 분명히 내 경고가 있기 때문에 @ 멋지 기 때문에 더 좋습니다.) :) – gsamaras

관련 문제