2016-06-06 5 views
0
int c=2; printf("%d %d %d",c,c<<=2,c>>=2); 

정의되지 않은 동작입니까?이 printf 함수의 정의되지 않은 동작입니까?

int c=2; 
printf ("%d %d %d",c,c<<=2,c>>=2); 
+3

예, 'c'는 중간에 시퀀스 포인트없이 여러 번 수정됩니다. – EOF

+1

첫 번째 경우'c'는 초기화되지 않습니다. –

+1

printf와는 아무런 관련이 없습니다. 모든 함수 호출에서 UB가됩니다. – rici

답변

0

동작은 정의되지 않습니다. 제약 조건의 외부에 나타나는 ''하여야한다 ''또는 '' '안된다'요구 사항을 위반하는 경우

[C99: 4/2]:이 동작은 정의되지 않습니다. 정의되지 않은 행동은이 국제 표준에서 "정의되지 않은 행동"이라는 단어 또는 행동의 명시 적 정의의 생략에 의해 달리 표시된다. 이 세 가지 사항 사이에 강조점은 없습니다. 그들은 모두 '정의되지 않은 행동'을 묘사합니다.

[C99: 5.1.2.3/2]: 휘발성 개체에 액세스하거나, 개체를 수정하거나, 파일을 수정하거나, 이러한 작업 중 하나를 수행하는 함수를 호출하는 것은 모든 부작용입니다. 11) 이는 실행 환경의 상태 변화입니다. 표현의 평가는 부작용을 일으킬 수 있습니다. 시퀀스 시퀀스라고하는 실행 시퀀스의 특정 특정 지점에서 이전 평가의 모든 부작용이 완료되고 후속 평가의 부작용이 발생하지 않아야합니다. (시퀀스 포인트에 대한 요약은 부록 C에 나와있다.) - 인수가 평가 된 후에 함수를 호출한다 (6.5.2.2). 5.1.2.3에서 설명한 시퀀스 포인트는 다음과 같다. . - 다음 연산자의 첫 번째 피연산자의 끝 : logical AND & & (6.5.13); 논리 OR || (6.5.14); 조건부? (6.5.15); 쉼표 (6.5.17). - 전체 선언 자의 끝 : 선언 자 (6.7.5); - 전체 표현식의 끝 : 초기화 프로그램 (6.7.8); 표현식 (6.8.3)에서의 표현; 선택 문의 제어 표현 (if 또는 switch) (6.8.4); while 문 또는 do 문의 제어 표현 (6.8.5); for 문 (6.8.5.3)의 각 표현; return 문에서의 표현 (6.8.6.4). - 라이브러리 함수가 반환되기 직전에 (7.1.4). - 각 형식화 된 입출력 함수 변환 지정자 (7.19.6, 7.24.2)와 연관된 작업 이후. - 비교 함수에 대한 각 호출 직전과 직후, 그리고 비교 함수 호출과 해당 호출에 대한 인수로 전달 된 객체 이동 (7.20.5) 사이.

[C99: 6.2.2.2/10]: 실제 인수 내에서 함수 지정자, 실제 인수 및 하위 표현식의 평가 순서는 지정되지 않지만 실제 호출 전에 시퀀스 포인트가 있습니다.

그리고 부정적인 것을 증명할 수는 없지만, 가변 인수의 경우에는 예외를두기위한 문언이 없습니다.

관련 문제