2010-06-04 4 views
1

는 다음 코드 (11)를 인쇄 할, 그러나 10피연산자 평가 순서 + 할당 부작용

x=5; x1=x+(x=6); printf("%d\n",x1); 
x=5; x1=(x=x)+(x=6); printf("%d\n",x1); 
x=5; x1=(x+0)+(x=6); printf("%d\n",x1); 
x=5; x1=(x=5)+(x=6); printf("%d\n",x1); 

x=5; x1=(x=6)+x; printf("%d\n",x1); 
x=5; x1=(x=6)+(x=x); printf("%d\n",x1); 
x=5; x1=(x=6)+(x+0); printf("%d\n",x1); 
x=5; x1=(x=6)+(x=5); printf("%d\n",x1); 

GCC가 모든 경우에 말한다 인쇄 마지막 경우를 제외하고, 12을 인쇄 '경고 : 'x'에 대한 연산은 정의되지 않을 수 있습니다. '

그건 의미합니다.

베른 하

추신 : 죄송합니다. 귀하의 답변에 감사드립니다. :)
PPS : 실제 코드는 : 나는 ADR에서 비트 6 기다리고

while (data-(data=read(adr)&(1<<6))) i++; 

는 전환 중지합니다.

+4

변수를 변경했을를 두 시퀀스 포인트 사이의 un입니다 정의 된 동작. 변수를 돌연변이 한 다음 그 값을 읽는 것입니다. 결과로 얻으려는 가치에 관계없이 잘못된 가정입니다. 표준을 준수하도록 코드를 다시 작성해야합니다. –

+0

[(i = i ++ + ++ i, i = i ++, etc ...) 이러한 정의되지 않은 동작을 설명 할 수있는 사람이 있습니까? (http://stackoverflow.com/questions/949433/could-anyone-explain-these- undefined-behaviors-iiiii-etc) –

+4

결과는 컴파일러가 진단 한대로 정의되지 않습니다. 그렇게 코드를 작성하지 마십시오. –

답변

2

결과가 정의되지 않았으므로 더 이상의 설명이 필요하지 않습니다. 그러나 코드를 치료할 수있는 두 가지 방법 컴파일러 을 설명합니다 :

int x = 1; 
int n = (x=3) + x; 

컴파일러 평가할 수있다 (X = 3) 처음 n에 할당 값 6이 아니면 먼저 X를 평가할 수있는 경우 ,이 경우 N에 할당 값을 가지고 4.

2

경고 이유 ... 시퀀스 포인트 간의 평가 순서가 지정되지 않았습니다.

+0

시퀀스 포인트 간의 평가 순서는 * 지정되지 않습니다 *. "정의되지 않은"은 조금 더 강렬한 용어이며,이 표준은 프로그램의 모든 부분의 동작에 대해 아무 것도 지정하지 않음을 의미합니다. –

1

당신은 당신이 원하는 루프 쓰기 위해, 다른 변수와 함께 거의 사용되지 쉼표 연산자를 사용할 수 있습니다

while (lastdata = data, lastdata != (data = read(adr) & (1<<6))) i++;