2012-06-23 5 views
4

가 I이 경고 던지고 샘플 코드의 비트 가지고, I는 ||&& 연산자를 사용하지 않도록했다 특정 연습C에서 정의되지 않은 동작입니까? (c = X) + (c == Y)

main.c: In function ‘getline_’: 
main.c:30:32: warning: operation on ‘c’ may be undefined [-Wsequence-point] 

을하지만 이것은 정의되지 않은 동작을 생성해야하는 것처럼 보이지 않습니다. 컴파일러 메시지 은 단지 경고이지만입니다.하지만 알고 있기를 바랍니다. 이 코드는 실제로 정의되지 않은 동작을 생성합니까?

24 int getline_(char s[], int limit) 
25 { 
26  int i, c; 
27  i=0; 
28  for(i=0; (i<limit-1) + ((c=getchar())!='\n') + (c!=EOF) == 3; i++){ 
29   s[i]=c; 
30  } 
31  if(c == '\n'){ 
32   s[i]=c; 
33   i++; 
34  } 
35  s[i]='\0'; 
36  return i; 
37 } 

기본 테스트에서 정상적으로 작동하는 것 같습니다.

편집 : 댓글 당 제목이 업데이트되었습니다. 감사합니다. pst.

+3

"여기에서 작동합니다"가 정의 된 동작을 의미하지는 않습니다. * UB *는 당신이 항상 보았던 행동일지도 모릅니다. (그렇지만 햄스터가 다른 곳으로 날아가는 것을 포함 할 수 있습니다) –

+1

정확히 알고 싶었 기 때문에 여기에 왔습니다. :) –

+1

테스트 케이스를 증류하는 것을 고려하십시오 (경고는 훨씬 덜 생성 될 수 있습니다). 그것은 기본적으로 다음과 같습니다 :'(c = x) + (c == y)' –

답변

13

이 지정되지 않은 동작입니다 :

(i<limit-1) + ((c=getchar())!='\n') + (c!=EOF) == 3

시퀀스 지점 간 식의 평가 순서가 c에 할당 EOF와 동등 검사 이전에 발생하는 경우가 지정되어 있지 않은 C로 지정되지 않습니다.

(C99, 6.5p2) "또한, 이전 값을 읽기만한다 : 그것은 순서 규칙을 가리키는 특히이 하나의 위반

불특정 동작 이외에

, 또한 정의되지 않은 동작이며 저장할 값을 결정할 수 있습니다. "

+2

Pedantic nitpick :하지만 경고는 그 정의되지 않은 행동이 명시되지 않은 행동이 아니라고 말합니다 ... –

+0

참고로, lisp가 필요합니다. 그 점을 지적 해 주셔서 감사합니다! 그냥 타이머가 받아 들일 때까지 기다리는 것을 기다린다. –

+1

@Als는 나의 편집을 본다 나는 또한 UB라고 생각한다 – ouah

관련 문제