(++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.
연산자의 크기는 연산자의 개체 표현에서 바이트 수를 산출합니다.피연산자는 평가되지 않은 피연산자인 식(제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
'programing' 카테고리의 다른 글
| SQL Server 2008에서 복합 기본 키를 만드는 방법 (0) | 2023.10.30 |
|---|---|
| 요소의 n번째 인스턴스를 가져오는 XPath 쿼리 (0) | 2023.10.30 |
| Are constant C expressions evaluated at compile time or at runtime? (0) | 2023.10.30 |
| C에서 이와 같은 번호를 정렬하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
| findViewById()는 다른 구성 요소가 아닌 레이아웃 XML의 사용자 지정 구성 요소에 대해 null을 반환합니다. (0) | 2023.10.30 |