C++에서는 여러 개의 사전 증분이 허용되지만 C에서는 허용되지 않는 이유는 무엇입니까?
이유는
int main()
{
int i = 0;
++++i;
}
유효한 C++이지만 유효하지 않은 C?
C와 C++는 접두사 ++의 결과에 대해 서로 다른 말을 합니다.C++에서:
접두사 ++의 피연산자는 1을 추가하여 수정됩니다.피연산자는 수정 가능한 l 값이어야 합니다.피연산자의 유형은 cvbool 이외의 산술 유형이거나 완전히 정의된 객체 유형에 대한 포인터여야 합니다.결과는 업데이트된 피연산자이며, 이 값은 l 값이며 피연산자가 비트 필드인 경우 비트 필드입니다.++x 식은 x+=1과 같습니다.
따라서 ++는 결과에 다시 적용할 수 있습니다. 왜냐하면 결과는 기본적으로 증가하는 객체이고 l 값이기 때문입니다.그러나 C의 경우:
접두사 증분 또는 감소 연산자의 피연산자는 원자형, 한정형 또는 무정형 실수 또는 포인터형이어야 하며 수정 가능한 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
'source' 카테고리의 다른 글
Java가 Sun/Oracle/OpenJDK인지 어떻게 알 수 있습니까? (0) | 2023.07.10 |
---|---|
vuex와 v-bind:class를 함께 작동할 수 없습니다. (0) | 2023.07.10 |
드롭...작성 대 변경 (0) | 2023.07.10 |
Javascript 내에서 테마 색상 배열 검색 (0) | 2023.07.10 |
Oracle에서 SQL을 통해 테이블 주석을 얻는 방법은 무엇입니까? (0) | 2023.07.10 |