2014-07-16 4 views
3
foo(a = b+c); 
//new value of a(after the call) = b+c 
//but 
sizeof(a = b+c); 
//new value of a = old value of a 

후자의 경우 할당 구문의 결과가 함수 스택 (위 코드 포함)에 반영되지 않는 이유는 무엇입니까?sizeof 함수를 내부에 할당

+0

내 [DUP 예는 (http://stackoverflow.com/a/21995718/1708801)은식이 sizeof' '로 평가 한 경우를 나타낸다. –

답변

6

sizeof은 기능이 아닌 연산자입니다. sizeof의 피연산자는 가변 길이 배열 인 경우를 제외하고는 계산되지 않습니다.

C11

: 6.5.3.4 P (2)

sizeof 연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다. 크기는 피연산자 유형에서 결정됩니다. 결과는 정수입니다. 피연산자 유형이 가변 길이 배열 유형이면 피연산자가 평가됩니다. 그렇지 않으면 피연산자가 계산되지 않고 결과는 정수 상수입니다.

2

sizeof은 피연산자를 평가하지 않습니다. 가변 길이 배열을 포함하는 경우를 제외

size_t x = sizeof(i++);  // i is not incremented 

:

피연산자의 형태는 가변 길이 배열 유형이면

(C99은 6.5.3.4p2)가 "피연산자가 평가되고, 그렇지 않으면 피연산자는 평가되지 않으며 결과는 정수입니다. "

size_t y = sizeof(int [j++]); // j is incremented; 
(C99, 6.7.5.2p4) "크기식이를 sizeof 연산자의 연산의 일부로서 어디에 연산자의 결과에 영향을 미치지 않을 크기의 식의 값을 변경 크기 표현식이 평가되는지 여부는 불특정입니다. "

size_t z = sizeof (*(int (*)[k++]) 0); // k may or may not be incremented 
             // gcc increments k