sizeof(x++)가 x가 증가하지 않는 이유는 무엇입니까?
다음은 dev c++ 창에서 컴파일된 코드입니다.
#include <stdio.h>
int main() {
int x = 5;
printf("%d and ", sizeof(x++)); // note 1
printf("%d\n", x); // note 2
return 0;
}
나는 나는으로 기대하고 있기대한다x
주 1 실행 후 6이 됩니다.다만, 출력은 다음과 같습니다.
4 and 5
왜왜그런지 설명해주실 분 누구 설명해 줄 수 있나요?x
주 1 이후 증가하지 않는가?
C99 Standard에서 (중요한 것은 나의 것)
6.5.3.4/2
sizeof 연산자는 피연산자의 크기(바이트 단위)를 산출합니다.이 값은 식 또는 괄호로 둘러싸인 형식의 이름입니다.크기는 오퍼랜드의 유형에 따라 결정됩니다.결과는 정수입니다.피연산자의 유형이 가변 길이 배열 유형인 경우 피연산자가 평가되고 그렇지 않은 경우 피연산자는 평가되지 않으며 결과는 정수 정수입니다.
sizeof
컴파일 시간 연산자이므로 컴파일 시sizeof
피연산자는 결과값으로 대체됩니다.피연산자는 (가변 길이 배열인 경우를 제외하고) 전혀 평가되지 않으며 결과 유형만 중요합니다.
short func(short x) { // this function never gets called !!
printf("%d", x); // this print never happens
return x;
}
int main() {
printf("%d", sizeof(func(3))); // all that matters to sizeof is the
// return type of the function.
return 0;
}
출력:
2
~하듯이로short
내 자동 응답기에 2바이트 Occupies.2바이트를 차지합니다.
함수의 반환 형식반환 유형 변경 함수의로 바꾸면.double
:
double func(short x) {
// rest all same
줄을 줄것이다 것이다8
출력으로.출력으로 사용합니다.
메모
이 답변은 복제에서 병합되었으며, 이것이 마지막 날짜를 설명합니다.
원래의
가변 길이 arraysizeof를 제외하고 인수를 평가하지 않습니다.이것은 초안 C99 표준 섹션에서 확인할 수 있습니다.6.5.3.4
운영자 2항의 크기는 다음과 같다.
sizeof 연산자는 피연산자의 크기(바이트 단위)를 산출합니다.이 값은 식 또는 괄호로 둘러싸인 형식의 이름입니다.크기는 오퍼랜드의 유형에 따라 결정됩니다.결과는 정수입니다.피연산자의 유형이 가변 길이 배열 유형인 경우 피연산자가 평가되고 그렇지 않은 경우 피연산자는 평가되지 않으며 결과는 정수 정수입니다.
코멘트(현재 삭제)는 다음과 같은 것이 런타임에 평가되는지 여부를 묻습니다.
sizeof( char[x++] ) ;
그리고 실제로도, 다음과 같은 것이 효과가 있습니다(둘 다 살아 있는 것을 확인).
sizeof( char[func()] ) ;
둘 다 가변 길이 배열이기 때문입니다.둘 다 실용적이진 않지만요
가변장 어레이는 초안 C99 표준 섹션에 기재되어 있습니다.6.7.5.2
어레이 선언자 패러그래프 4:
[...] 크기가 정수 상수 표현식이고 요소 유형이 알려진 상수 크기를 가진 경우 배열 유형은 가변 길이 배열 유형이 아닙니다. 그렇지 않은 경우 배열 유형은 가변 길이 배열 유형입니다.
갱신하다
C11에서는 VLA 케이스에 대한 답변이 변경되며 경우에 따라 크기 표현식의 평가 여부가 지정되지 않을 수 있습니다.6.7.6.2
다음을 나타내는 배열 선언자:
[...사이즈 표현식이 연산자의 피연산자의 일부이고 크기 표현식의 값을 변경해도 연산자의 결과에 영향을 미치지 않는 경우 크기 표현식의 평가 여부가 지정되지 않습니다.
sizeof( int (*)[x++] )
sizeof(foo)
시 하기 위해 노력하고 있습니다.
6.5.3.4:
sizeof 연산자는 피연산자의 크기(바이트 단위)를 산출합니다.이 값은 식 또는 괄호로 둘러싸인 형식의 이름입니다.크기는 오퍼랜드의 유형에 따라 결정됩니다.결과는 정수입니다.피연산자의 유형이 가변 길이 배열 유형인 경우 피연산자가 평가되고 그렇지 않은 경우 피연산자는 평가되지 않으며 결과는 정수 정수입니다.
즉, 가변 길이 배열은 런타임에 실행됩니다.(주의: 가변길이 어레이는 특정 기능이며 어레이가 할당되어 있지 않습니다.malloc(3)
그렇지 않으면 식 유형만 계산되고 컴파일 시 계산됩니다.
sizeof
는 컴파일 시간 빌트인 연산자로 함수가 아닙니다.이것은 괄호 없이 사용할 수 있는 경우에 매우 명확해집니다.
(sizeof x) //this also works
을 사용법 ★★★★★★★★★★★★★★★★★.++i
/i++
일어나지 않을 것이다. 한 also도.sizeof(foo())
는 함수를 실행하지 않고 올바른 유형을 반환합니다.
sizeof
시에 하지만, 「」가 .x++
런타임에만 평가할 수 있습니다. C에서는 C++의 가 로 지정되어 있습니다.sizeof
을 사용하다다.
[ of " " " / ]의
sizeof
]는 가변길이 배열 유형으로 오퍼랜드가 평가됩니다.평가되지 않은 경우 오퍼랜드는 평가되지 않고 결과는 정수 정수입니다.
다음 행:
printf("%d and ", sizeof(x++)); // note 1
UB를 사용하다 %d
이 필요합니다.int
size_t
UB를 취득하면 stdout에 쓴 바이트를 포함하여 동작이 정의되지 않습니다.
" " " " " " 를 하겠습니다.%d
%zu
을 던지다.int
다 그렇지는 않을 여전히 증가하지 않습니다.x
하지만 그것은 다른 문제이며 다른 질문으로 물어봐야 합니다.
sizeof()
연산자는 데이터 유형의 크기만 제공하며 내부 요소를 평가하지 않습니다.
「 」의 sizeof
이치노이 작업을 수행할 수 있습니다.
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
온라인 데모 : http://ideone.com/S8e2Y
됩니다.f
sizeof
C++ 됩니다.C에서는 C++의, C++의 피연산자, C++의 피연산자 입니다.sizeof
을 사용하다
게게왜 동동?하는 것은, 「 」가 때문입니다.sizeof
연산자는 값에 대해 연산하지 않고 식의 유형에 따라 연산합니다.그래서 글을 쓸 때sizeof(f())
, 이것은 식의 유형으로 동작합니다.f()
일 뿐입니다.f
함수가 실제로 실행될 경우 반환되는 값에 관계없이 반환 유형은 항상 동일합니다.
C++ 에서는, 다음의 조작도 가능합니다.
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
은 마치sizeof
먼저 의 보겠습니다.A
라고 적습니다.A()
다음 f
를 들어, 「」라고 , 「」A().f()
하지만 그런 일은 일어나지 않는다.
데모 : http://ideone.com/egPMi
또 .sizeof
:
언급URL : https://stackoverflow.com/questions/8225776/why-does-sizeofx-not-increment-x
'programing' 카테고리의 다른 글
저장소에 데이터가 있을 때 함수를 호출하는 방법 (0) | 2022.08.16 |
---|---|
Vuex를 사용한 값 설정 (0) | 2022.08.16 |
JPA에 @Transient 주석이 있는 이유는 무엇입니까? (0) | 2022.08.16 |
Java에 임시 필드가 있는 이유는 무엇입니까? (0) | 2022.08.16 |
vue composition api는 이름 경합을 어떻게 해결합니까? (0) | 2022.08.16 |