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의 작동 방식은 무엇입니까?
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의 작동 방식은 무엇입니까?
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]
.
내가 가지고 : 예를 들어../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;
, 코드가 정의되지 않은 동작에 이르게 :
그것은이 같은해야한다.
@Deduplicator 다른 답변에서 분명히 내 경고가 있기 때문에 @ 멋지 기 때문에 더 좋습니다.) :) – gsamaras
표준에 따르면 정의되지 않은 동작입니다. 함수 인수가 왼쪽에서 오른쪽으로 평가된다는 것을 기대하는 것 같습니다. 그들은 그렇지 않을 수도 있습니다. –
질문에 올바른 언어 태그를 추가해야합니다. [태그 : c] 또는 [태그 : C++] – Sayse
@Sayse 이것은 C++가 아니라 C입니다. –