programing

두 인수를 사용하는 크기

telebox 2023. 8. 5. 10:03
반응형

두 인수를 사용하는 크기

C++ IS의 C.1.3에서 (2003).C++11 IS에도 있습니다.) 표준은 ISO C와 C++의 차이를 지적합니다. 즉, 다음과 같습니다.

char arr[100];

sizeof(0, arr)아온다를 합니다.sizeof(char*)C에서, 그러나100C++로.

다에대한문찾없다니습수을에 대한 수 .sizeof두 가지 주장을 받아들입니다. 연산자이지만, 저는 하지 않습니다: 분한단점쉼표연만지이산저, 그생않습다니지각하게렇.sizeof(arr)C에 있어서는100;sizeof(0, arr)이라sizeof(char*).둘다요.sizeof(0, arr)그리고.sizeof(arr)100C++로.

저는 이 맥락에서 IS의 전체 요점을 놓치고 있을 수 있습니다.누가 도와줄 수 있습니까?이것은 지난 09년에 논의된 질문과 비슷하지만, 아무도 IS를 언급하지 않았고, 저는 정답이 주어지지 않았다고 생각합니다.


편집: 사실, IS는 쉼표 연산자에 대해 이야기하고 있습니다.그래서 어떤 이유에서.(0, arr)를 반환합니다.char* C로, 그로a로char[100]C++로. 왜요?

값을 C 서 쉼 는 자 값 을 생 지 않 으 로 므 배 열 이arr즉, l값은 포인터 유형으로 감소하며, 이 경우에는 ar값입니다.sizeof(0,arr)와 동등해집니다.sizeof(char*)lvalue-to-rvalue 변환으로 인해.

그러나 C++에서는 쉼표 연산자가 l 값을 생성합니다.lvalue에서 rvalue로의 변환은 없습니다. 그래서sizeof(0,arr)동일하게 유지되며, 이는 다음과 같습니다.sizeof(char[100]).

그렇고, 그저나나.sizeof함수가 아니라 연산자입니다.한 C (하면 C)입니다.printfcout):

int a[100], b[200], c[300], d[400];
cout << sizeof(a,b,c,d) << endl;

데모: http://www.ideone.com/CtEhn

당신은 내가 4개의 피연산자를 넘겼다고 생각할지도 모릅니다.sizeof하지만 그것은 잘못됐습니다.sizeof쉼표 연산자의 결과에 따라 작동합니다.많은 피연산자를 볼 수 있는 쉼표 연산자 때문입니다.

콤마 연산자가 피연산자는 3개의 피연산자와 .1+2+3+43명의 연산자, 4명의 피연산자가 있습니다.

위의 값은 다음과 같습니다(C++0x에서 유효).

auto & result = (a,b,c,d); //first all comma operators operate on the operands.
cout << sizeof (result) << endl; //sizeof operates on the result

데모: http://www.ideone.com/07VNf

그래서 여러분많은 논쟁이 있다는 것을 느끼게 해주는 것은 쉼표 연산자입니다.여기서 쉼표는 연산자이지만 함수 호출에서 쉼표는 연산자가 아니라 단순히 인수 구분 기호입니다.

function(a,b,c,d); //here comma acts a separator, not operator.

그렇게sizeof(a,b,c,d)의 결과 유형에 따라 작동합니다.,연산자, 정히같방로운영자들은으식은확,▁operators은들자영.sizeof(1+2+3+4)의 결과 유형에 따라 작동합니다.+operators

또한 당신은 쓸 수 없습니다.sizeof(int, char, short)쉼표 연산자는 형식에서 작동할 수 없기 때문입니다.에 대해서만 작동합니다.생각합니다,sizeof는 C 및 C++의 유일한 연산자로, 유형에서도 작동할 수 있습니다.C++에는 유형에 대해 작동할 수 있는 연산자가 하나 더 있습니다.이름은typeid.

C에서 배열은 r값과 l값에 대한 쉼표 연산자의 규격이 다르기 때문에 포인터로 감쇠합니다(이러한 차이를 찾을 수 있는 유일한 위치는 아닙니다).C++에서는 배열이 배열로 유지되어 올바른 결과를 산출합니다.

쉼표 연산자입니다.그리고 당신이 말하는 차이점은 전혀 관련이 없습니다.sizeofLvalue-to-rvalue, Array-to-point 및 C++ 언어 간의 유사한 붕괴 동작에서 차이가 실제로 발생합니다.

점에서 C 합니다: 은 실질적으로컨텍스트의 를 제외하고). C 언행이오트점특리다니-히합거복다: ▁of▁c▁the▁c▁result▁decay▁is▁why▁pract-▁in:▁this▁regard고▁rather),행▁trigger▁which▁arrays▁ishappy▁to▁contexts▁specific제하with▁pointers의 결과입니다. 이것이 바로 결과입니다.0, arr에는 표이있습다니가 있습니다.char * 합니다. 그것은 다음과 같습니다.0, (char *) arr.

C++ 언어 어레이에서는 "어레이"를 훨씬 더 오래 보존합니다.▁of의 할 때, ( l ), 이 C에서 연l자배그않다는에지괴산붕하이다것다않서는이니, 리고이다 C++음입유의되유이형는로열은인의 입니다.0, arr 표이고 니다합요정입니다.char[100].

이 이이에서차설것입다니명는하을이의 를 설명하는 입니다.sizeof그 예에서의 행동.?:는 붕괴 한 차이를 또입니다. 연자는붕거보차연는여또산다의예다자입니른주이를한산사유괴동의▁that▁operator▁is,▁behavior▁another▁operator다▁i예다또.sizeof(0 ? arr : arr)C와 C++에서 다른 결과를 제공합니다.기본적으로 이 모든 것은 C 연산자가 일반적으로 피연산자의 l값을 보존하지 않는다는 사실에서 비롯됩니다.많은 연산자를 사용하여 이 동작을 시연할 수 있습니다.

이것은 아닙니다.sizeof두 가지 주장을 받아들입니다.sizeof함수가 아니라 연산자입니다.

그것을 생각해 .(0, arr)는 쉼표 연산자를 사용하는 식이며, 다른 모든 것은 제자리에 들어갑니다.

여기서 무슨 일이 일어나고 있는지 확인하는 가장 좋은 방법은 표준의 문법을 보는 것입니다. section 초안 C99 ,▁c▁the▁▁at▁if▁we▁look면99살보▁section펴▁standard초99을안션.6.5.3 단항 연산자 1항에서 크기에 대한 문법은 다음과 같습니다.

sizeof unary-expression
sizeof ( type-name )

그래서 두 번째 것은 적용되지 않지만 어떻게.sizeof unary-expression이 경우에 적용하시겠습니까?가 섹션을 요.A.2.1 초안 표준의 표현과 다음과 같은 문법을 사용합니다.

unary-expression -> postfix-expression -> primary-expression -> ( expression )

우리는 표현식 주위에 괄호를 가지고 있고 이제 우리는 섹션에서 쉼표 연산자에 대한 문법을 봐야 합니다.6.5.17 쉼표 연산자가 표시됩니다.

expression:
  assignment-expression
  expression , assignment-expression

이제 다음과 같은 이점이 있습니다.

sizeof( expression , assignment-expression )
                   ^
                   |
                   comma operator

표현식할당-표현식 모두 다음과 같은 문법을 가진 일차 표현식으로 우리를 데려갈 수 있습니다.

primary-expression:
  identifier
  constant
  string-literal
  ( expression )

그리고.0상수이고arr식별자이기 때문에 다음과 같은 정보를 얻을 수 있습니다.

 sizeof( constant , identifier )

여기서 콤마 연산자는 무엇을 합니까?부분6.5.17제2항은 다음과 같습니다.

쉼표 연산자의 왼쪽 피연산자는 빈 표현식으로 평가되며 평가 후 시퀀스 포인트가 있습니다.그런 다음 오른쪽 피연산자가 평가되고 결과에는 유형과 97)값이 있습니다.

쉼표 연산자는 배열이 포인터로 변환되지 않는 예외 중 하나가 아니기 때문에 포인터를 생성합니다(이것은 섹션에서 다룹니다). 6.3.2.1 L, 배열함수 지정자). 즉, 다음과 같은 결과를 얻을 수 있습니다.

sizeof( char * )

C++에서는 문법이 꽤 비슷해서 같은 장소에서 끝나지만 쉼표 연산자는 다르게 작동합니다.C++ 초안 표준 섹션5.18 쉼표 연산자는 다음과 같이 말합니다.

[...]결과의 유형 및 값은 오른쪽 피연산자의 유형 및 값입니다. 결과는 오른쪽 피연산자와 동일한 값 범주입니다. [...]

따라서 어레이에서 어레이로 변환할 필요가 없으므로 다음과 같은 이점이 있습니다.

sizeof( char[100] ) 

sizeof두 개의 인수를 사용하지 않습니다.에 하만그기아때문에니기능이것도지,,(...)함수 인수를 구분하지 않고 구문의 선택적 부분일 뿐이며 그룹화를 적용합니다.▁▁you▁when을글당을 쓸 때.sizeof(0, arr)에한대주장에 대한 sizeof 단일표입니다식현▁the다입니다.0, arr쉼표 연산자가 있는 단일 식은 쉼표 왼쪽의 식을 평가하고, 값을 삭제한 다음(부작용은 제외) 쉼표 오른쪽의 식을 평가하고 값을 전체 식의 값으로 사용합니다.

C에 대해서는 잘 모르겠지만, 이것은 언어 간의 차이일 수 있습니다.C++에서 어레이에서 포인터로의 변환은 필요한 경우가 아니면 일어나지 않습니다. C에서 표준은 내가 정확히 기억하기만 하면 특정 컨텍스트를 제외하고는 항상 발생한다고 말합니다. 포서함의 됩니다.sizeof이 경우 쉼표 연산자는 피연산자 유형에 대한 제약이 없으므로 C++에서는 배열에서 포인터로의 변환이 수행되지 않습니다.C에서 쉼표 연산자의 연산자는 예외에 나열되지 않으므로 배열에서 포인터로의 변환이 수행됩니다.(이 경우 배열은 쉼표 연산자의 피연산자이며, 다음의 피연산자는 아닙니다.)sizeof.)

몇몇 사람들이 이미 말했듯이, 그리고 저는 단지 한 가지만 덧붙이고 싶습니다, size는 표현식이나 캐스트 표현식을 취하는 연산자입니다.이러한 이유로 저는 비유를 캐스팅 표현일 경우에만 크기로 쓰는 습관을 들였습니다.

 char *arr;
 struct xxx { ... } v;

글을 쓰겠습니다

sizeof arr 
sizeof v

그렇지만

sizeof (struct xxx)       /* Note the space after the sizeof, it's important */
sizeof (char *)

도 마찬가지입니다.return괄호는 없습니다. 함수 호출이 아니기 때문에 괄호를 사용하지 않습니다. 그리고 괄호를 사용하면 다음 식을 사용해야 하기 때문입니다.

언급URL : https://stackoverflow.com/questions/6331588/sizeof-taking-two-arguments

반응형