의 시퀀스 포인트 개념은 GCC는 결과를 코드 조각은 내가 기대하지 않았다가 목표는 i686-리눅스 GNU위한 -9ubuntu3) 내 이해후 증가, 함수 호출, GCC
[TEST.C]
#include <stdio.h>
int *ptr;
int f(void)
{
(*ptr)++;
return 1;
}
int main()
{
int a = 1, b = 2;
ptr = &b;
a = b++ + f() + f() ? b : a;
printf ("b = %d\n", b);
return a;
}
는 함수 호출 시퀀스에서 포인트가있다. 후행 증가는 f() 전에 수행되어야합니다.
는 C99 5.1.2.3 참조하십시오. "...라고 시퀀스 포인트, 완전하며, 이후 평가의 부작용이 이 자리를 차지하게 안된다 이전 평가의 모든 부작용"
이 테스트 케이스의 경우 평가 순서가 지정되지 않았으므로 이지만 최종 결과는 동일해야합니다. 그래서 나는 b의 최종 결과가 5 일 것으로 예상한다. 그러나이 경우를 'gcc test.c -std = c99'로 컴파일하면 b = 3이 출력된다.
그런 다음 "gcc test.c -std = C99 -S는 "무슨 일이 있었는지 볼 수 있습니다 : GCC는 F 전에 평가 값()를 사용하고 실시 할 것을 보인다
movl $1, 28(%esp)
movl $2, 24(%esp)
leal 24(%esp), %eax
movl %eax, ptr
movl 24(%esp), %ebx
call f
leal (%ebx,%eax), %esi
call f
addl %esi, %eax
testl %eax, %eax
setne %al
leal 1(%ebx), %edx
movl %edx, 24(%esp)
testb %al, %al
je .L3
movl 24(%esp), %eax
jmp .L4
.L3:
movl 28(%esp), %eax
.L4:
movl %eax, 28(%esp)
'++' 작업이 F 후()를 호출합니다.
또한이 경우를 컴파일하려면 llvm-clang을 사용하고 결과는 b = 5로 표시됩니다. 이는 예상 한 것입니다.
포스트 증가 및 시퀀스 포인트 동작에 대한 나의 이해가 올바르지 않습니까 ?? 또는 이것은 GCC461의 알려진 문제입니까?
Welcome to StackOverflow! 연구를 위해 복사 - 붙여 넣기를 원하는 프로그램 라인에 번호를 매기 지 마십시오. –
오 ~ 확인! 이제 프로그램 줄 수를 제거했습니다. 상기시켜 주셔서 감사합니다! :) –