source

C++에서는 여러 개의 사전 증분이 허용되지만 C에서는 허용되지 않는 이유는 무엇입니까?

manycodes 2023. 7. 10. 22:31
반응형

C++에서는 여러 개의 사전 증분이 허용되지만 C에서는 허용되지 않는 이유는 무엇입니까?

이유는

int main()
{
    int i = 0;
    ++++i;
}

유효한 C++이지만 유효하지 않은 C?

C와 C++는 접두사 ++의 결과에 대해 서로 다른 말을 합니다.C++에서:

[expr.pre.incr]

접두사 ++의 피연산자는 1을 추가하여 수정됩니다.피연산자는 수정 가능한 l 값이어야 합니다.피연산자의 유형은 cvbool 이외의 산술 유형이거나 완전히 정의된 객체 유형에 대한 포인터여야 합니다.결과는 업데이트된 피연산자이며, 이 값은 l 값이며 피연산자가 비트 필드인 경우 비트 필드입니다.++x 식은 x+=1과 같습니다.

따라서 ++는 결과에 다시 적용할 수 있습니다. 왜냐하면 결과는 기본적으로 증가하는 객체이고 l 값이기 때문입니다.그러나 C의 경우:

6.5.3 단항 연산자

접두사 증분 또는 감소 연산자의 피연산자는 원자형, 한정형 또는 무정형 실수 또는 포인터형이어야 하며 수정 가능한 l 값이어야 합니다.

접두사 ++ 연산자의 피연산자 값이 증가합니다.결과는 증분 후 피연산자의 새 입니다.

결과는 값이 아니라 증분의 순수한 값일 뿐입니다.따라서 ++를 포함하여 n 값이 필요한 연산자는 적용할 수 없습니다.

C++와 C가 서로의 초집합 또는 부분 집합이라는 말을 들은 적이 있다면 그렇지 않다는 것을 알아야 합니다.그 주장을 거짓으로 만드는 많은 차이점들이 있습니다.

C에서는 항상 그런 식이었습니다.에 증가된 사전증때수 때문일 것입니다.++ CPU에서 될 수 .++개념이 개발되었습니다.

C++에서는 연산자 오버로딩을 고려해야 하는 대칭성이 있습니다.표준 사전 증분인 C를 일치시키는 방법++를 반환해야 .const &사용자 정의 유형과 기본 제공 유형(냄새일 수 있음)에 대해 다른 동작이 있는 경우를 제외합니다.로의 반환 제한const &장치입니다.그래서 돌아온 것은++기본 제공 유형에 대한 CPU 최적화를 활용하기 위해 컴파일러 복잡성이 증가하는 대신 C 규칙을 완화합니다.

C++에서 왜 그것이 좋은지 당신이 이해한다고 생각하기 때문에 저는 그것에 대해 자세히 설명하지 않을 것입니다.

무슨 일이 있어도 제 테스트 결과는 다음과 같습니다.

t.c:6:2: error: lvalue required as increment operand
  ++ ++c;
  ^

CppReference에 대하여:

l 값이 아닌 개체 식

일반적으로 rvalue라고 하는 비lvalue 객체 표현식은 객체를 지정하지 않고 객체 ID나 저장 위치가 없는 값을 나타내는 객체 유형의 표현식입니다.l값이 아닌 개체 식의 주소를 가져올 수 없습니다.

다음 식은 lvalue가 아닌 개체 식입니다.

  • 다음을 포함하여 l 값을 반환하도록 지정되지 않은 모든 연산자

    • 증분 및 감소 연산자(참고: 사전 형식은 C++의 l 값)

n1570의 섹션 6.5.3.1:

접두사 ++ 연산자의 피연산자 값이 증가합니다.결과는 증분 후 피연산자의 새 입니다.

따라서 C에서 접두사 증분 및 접두사 감소 연산자의 결과는 l 값이 될 필요가 없으므로 다시 증분할 수 없습니다.사실, 그러한 단어는 "버밸류가 되기 위해 필요한" 것으로 이해될 수 있습니다.

다른 답변들은 표준이 요구하는 바가 어떻게 다른지를 설명합니다.이 대답은 차이 영역에서 동기부여가 되는 예를 제공합니다.

C++에서는 다음과 같은 기능을 사용할 수 있습니다.int& foo(int&);이것은 C에 아날로그가 없습니다.C++가 다음과 같은 옵션을 갖는 것은 유용합니다 (그리고 부담스럽지 않습니다)foo(foo(x));.

기본 유형에 대한 작업이 어디선가 정의되었다고 잠시 상상해 보십시오.int& operator++(int&);.++++x그 자체가 동기부여가 되는 예는 아니지만, 그것은 패턴에 맞습니다.foo위에.

언급URL : https://stackoverflow.com/questions/48203314/why-are-multiple-pre-increments-allowed-in-c-but-not-in-c

반응형