source

C 같은 언어로 ++i++를 할 수 없는 이유는 무엇입니까?

factcode 2023. 10. 16. 22:07
반응형

C 같은 언어로 ++i++를 할 수 없는 이유는 무엇입니까?

농담 반 진담 반 : 왜 안 돼요?++i++C 같은 언어로, 특히 C#로?

값을 증가시켜 표현에 사용한 다음 다시 증가시킬 것으로 예상합니다.

"It's not alvalue"라는 짧은 대답은 맞지만, 그것은 아마도 단지 질문을 구걸하는 것일 것입니다. 가치가 없는 거지?혹은 C#에서 말하는 변수.

그 이유는 케이크를 먹을없기 때문입니다.논리적으로 해결:

먼저, C#에서 ++ 연산자의 의미는 후소나 접두사를 막론하고 " 변수의 값을 취하고, 값을 증가시키고, 새로운 값을 변수에 할당하고, 결과적으로 값을 생성합니다."입니다.결과로 생성된 값은 후처리인지 접두사인지에 따라 원래 값 또는 증분 값입니다.그러나 어느 쪽이든 가치를 창출합니다.

둘째, 변수의 값은 항상 해당 변수의 현재 내용입니다. (Modulo는 우리를 멀리 데려다 줄 특정한 이상한 스레드 시나리오를 사용합니다.)

나는 당신이 이것들이 완벽하게 합리적인 규칙이라는 것에 동의하기를 바랍니다.

이제 i++의 결과가 변수가 될 수 없는 이유는 분명해야 하지만, 그렇지 않은 경우에는 분명히 말씀드리겠습니다.

제가 10이라고 가정해보세요.i++의 의미는 "i — 10 — 증분 - 11 — 저장 - i가 현재 11이므로 원래 값을 10으로 하라"는 것이어야 합니다.따라서 print(i++)라고 하면 10을 인쇄해야 하고, 11은 i에 보관해야 합니다.

이제 i++의 의미가 이 아닌 변수를 반환하는 것이라고 가정합니다.프린트(i++)라고 하면 어떻게 됩니까?i - 10 - 증분 - 11 - 저장 - i는 이제 11입니다 - 결과적으로 변수를 반환합니다.변수의 현재 값은 얼마입니까? 11! 정확히 인쇄하고 싶지 않은 값입니다.

간단히 말해서, 만약 i++가 변수를 반환한다면, 그것은 연산자의 의도된 의미와 정반대의 행동을 하는 것입니다!당신의 제안은 논리적으로 일관성이 없기 때문에 어떤 언어도 그렇게 하지 않습니다.

단답형:i++는 "l 값"이 아니므로 할당의 대상이 될 수 없습니다.

일반적인 관례를 어겼다는 이유로 해고된 지 한참이 지난 후에 다음 프로그래머가 코드를 유지(또는 다시 쓰려는)하는 것에 관심이 있기 때문입니다.

해결 방법으로 (++i,i++)를 테스트했습니다.

#include <stdio.h> 

int main(){
  int i=0;

  printf(" i:         %i\n", i         );
  printf(" (++i,i++): %i\n", (++i,i++) );
  printf(" i:         %i\n", i         );
}

결과:


i:         0
(++i,i++): 1
i:         2

의 .i++nalvalue가다가 .

증분(또는 감소) 연산자에 할당할 값이 필요하다고 생각합니다.하지만 ++i는 al 값이 아니라 수식입니다.컴파일러에 더 정통한 사람이 이 제약 조건에 대한 기술적인 이유가 있는지 명확히 할 수 있습니다.

C# 3.0 규격의 섹션 7.5.9에서 다음과 같이 합니다.

사후 수정 증분 또는 감소 작업의 피연산자는 변수, 속성 액세스 또는 인덱서 액세스로 분류된 식을 사용해야 합니다.연산 결과는 피연산자와 같은 유형의 값입니다.사후 수정 증분 또는 감소 작업의 피연산자가 속성 또는 인덱서 액세스인 경우 속성 또는 인덱서에는 get 및 set accessor가 모두 있어야 합니다.그렇지 않은 경우 컴파일 시간 오류가 발생합니다.

후 , 으로(i++ 증분 입니다보다 가 높기 됩니다.++i 합니다.

C# 사양에서:

사후 수정 증분 또는 감소 작업의 피연산자는 변수, 속성 액세스 또는 인덱서 액세스로 분류된 식을 사용해야 합니다.연산 결과는 피연산자와 같은 유형의 입니다.

증분 연산자는 변수(및 ㏇)에만 적용할 수 있으며 변수가 아닌 값을 반환합니다.값에 증분을 적용할 수 없으므로(단순히 결과를 할당할 변수가 없기 때문에) C#에서는 변수를 한 번만 증분할 수 있습니다.

사실 C++는 상황이 다릅니다.C++ 규격에 따라:

접두사 증분 또는 감소가 l값 식임

즉, C++에서는 접두사 증가 또는 감소의 결과에 대해 증분을 호출할 수 있습니다.예를 들어 다음 C++ 코드가 실제로 유효합니다.

#include <iostream>

using namespace std;

int main()
{
    int i = 13;

    (--i)++;
    cout<<i<<endl;

    (++i)--;
    cout<<i<<endl;

    return 0;
}

NB: 용어 l 은 C와 C++에서만 사용됩니다.그리고 C의 다양성을 위해 접두사 증가의 결과는 실제로 r값이므로 C에서 증가를 증가시킬 수 없습니다.
C# 언어는 variable_reference라는 용어를 유사한 개념으로 사용합니다.

variable_reference는 변수로 분류되는 식입니다.variable_reference는 현재 값을 가져오고 새 값을 저장하기 위해 액세스할 수 있는 저장 위치를 나타냅니다.

언급URL : https://stackoverflow.com/questions/1511082/why-cant-i-do-i-in-c-like-languages

반응형