programing

(++n) 식 크기에서 증분 연산자가 호출되지 않았습니다.

elecom 2023. 10. 30. 20:33
반응형

(++n) 식 크기에서 증분 연산자가 호출되지 않았습니다.

C 및 C C++ 에서()++n,--n)에 있는 경우 수행하지 않습니다.sizeof()교환입니다.

int n = 100;
int size_int = sizeof(++n);
std::cout<<n;

이 코드를 작성해서 프로그램을 실행하고 있습니다.그럼요, 101이 보여질 것 같아요.그렇지만,n101이 아니라 100이었습니다.

왜 그런 것일까요?

C++에서 안에 있는 표현은sizeof평가되지 않습니다. C99를 제외하고는 VLA as mentioned in comments, since this was earlier tagged for C too

sizeof연산자는 컴파일 타임에 계산됩니다.

컴파일 시간에 계산되는 식의 유형만 다음에 의해 사용됩니다.sizeof.

C++ 표준 § 5.3.3 크기

연산자의 크기는 연산자의 개체 표현에서 바이트 수를 산출합니다.피연산자는 평가되지 않은 피연산자인 식(제5항) 또는 괄호로 묶은 유형-id입니다.

일부 C++ 컴파일러는 아래에 설명된 것처럼 확장 기능으로 VLA를 제공합니다.

에서 C sizeof는 가변 길이 배열을 제외하고는 평가되지 않습니다.

6.5.3.4.p2:

연산자의 크기는 연산자의 크기(바이트 단위)를 산출하며, 이는 식 또는 유형의 괄호가 붙은 이름일 수 있습니다.피연산자의 유형에 따라 크기가 결정됩니다.결과는 정수입니다.피연산자 유형이 가변 길이 배열 유형이면 피연산자를 평가하고, 그렇지 않으면 피연산자를 평가하지 않고 결과가 정수 상수입니다.

을 .n++다음과 같이 가변 길이 배열로 입력합니다.

int n = 1 ; 
sizeof( int(*)[n++] ) ;

피연산자를 평가할 경우 지정되지 않습니다.

6.7.6.2. p5

크기가 정수 상수 식이 아닌 식인 경우: 함수 프로토타입 범위의 선언에서 발생하면 *로 대체된 것처럼 처리되며, 그렇지 않으면 평가될 때마다 0보다 큰 값을 가져야 합니다.가변 길이 배열 유형의 각 인스턴스 크기는 수명 동안 변경되지 않습니다.크기 식이 연산자 크기 피연산자의 피연산자의 일부이고 크기 식의 값을 변경해도 연산자의 결과에 영향을 미치지 않는 경우에는 크기 식의 평가 여부가 지정되지 않습니다.

인 C++sizeof피연산자를 평가하지 않습니다

C++ 표준의 견적, 부품[expr] 5/7C++11 또는[expr] 5/8C++14에서:

일부 컨텍스트에서는 평가되지 않은 피연산자가 나타납니다(5.2.8,5.3.3,5.3.7,7.1.6.2). 평가되지 않은 피연산자는 평가되지 않습니다.

여기서5.3.3언급합니다.sizeof(그리고 다른 것들은typeid,noexcept그리고.decltype).

C++98 표준에는 이 단락이 없지만 어쨌든 그 부분에5.3.3 Sizeof이는 새로운 표준과 본질적으로 동일한 내용을 담고 있습니다.

sizeofoperator는 피연산자의 객체 표현에서 바이트 수를 산출합니다.피연산자가 평가되지 않은 식이거나 괄호로 묶은 형식-id입니다.

다음의 분해를 확인하는 경우:

int size_int = sizeof(++n);

그러면 컴파일러에 따라 다음과 같은 것이 나타납니다.

mov dword ptr [size_int],4

sizeof(...)식은 컴파일 타임 동안 평가되며, 상수 값으로 대체됩니다.

위의 예에서, 다음과 같은 상수 값이sizeof(...)식이 4로 대체되었습니다.

언급URL : https://stackoverflow.com/questions/26403970/increment-operator-is-not-invoked-at-sizeofn-expression

반응형