C++에서 작업할 때 여러 개의 감소 연산자가 C에서 작동하지 않는 이유는 무엇입니까?
이 질문을 보고 몇 가지 코드를 시험해 보겠습니다.
int x = 100;
while ( 0 <-------------------- x )
{
printf("%d ", x);
}
컴파일을 시도했습니다.gcc
다음 오류가 발생했습니다.
file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
while ( 0 <-------------------- x )
하지만 컴파일은g++
이 코드는 C++에서는 유효하지만 C에서는 유효하지 않은 이유는 무엇입니까?
주식회사,--x
값은 값이지 l값이 아닙니다.그 효과는 감소한다.x
새로 할당된 값으로 평가합니다.x
.부터--x
는 l값이 아니므로 감소시킬 수 없습니다.
C++에서는--x
r값이 아닌 l값입니다.그 효과는 감소한다.x
, 및 평가 대상x
lvalue로 지정합니다.부터--x
값이 다시 l값이므로 다시 감소할 수 있습니다.
이치에 맞는 이유--x
C++에서 l값이 되는 것은 C++가 기준 유형을 도입했기 때문입니다.정해진
void f(int &);
int i;
전화하는 것이 말이 될 수도 있다f(--i)
, 이것은 통과합니다.i
기준치입니다.
C에는 레퍼런스 타입이 없기 때문에 의미가 없습니다.--i
lvalue가 됩니다.지금까지 C++와는 달리 C는 규칙을 변경해야 하는 설득력 있는 이유를 얻지 못했습니다.
C++에서는, 보다 광범위한 변경이 필요했습니다.--x
lvalue를 설정합니다.만들기--x
lvalue는 다른 어떤 것도 없이--x
에 대한 수정 사이에 시퀀스 포인트가 존재하지 않기 때문에 정의되지 않은 동작x
및 후속 l-value-to-value 변환.더 명확하게 말하면----x
. C++는 동작시키기 위해 시퀀스 규칙을 수정해야 했습니다.C에서는 시퀀스 규칙을 변경하면 기존 컴파일러가 새로운 규칙을 준수하는 데 문제가 발생할 수 있으므로 큰 이점이 없는 한 이러한 변경은 거부될 수 있습니다.
언급URL : https://stackoverflow.com/questions/42355908/why-dont-multiple-decrement-operators-work-in-c-when-they-work-in-c
'source' 카테고리의 다른 글
Vuex에 Fabric.js 캔버스 참조 저장 - [vuex] 변환 핸들러 외부에 있는 vuex 스토어 상태를 변환하지 않음 (0) | 2022.08.29 |
---|---|
Nuxt.js에서 json 데이터를 스토어에 로드하려면 어떻게 해야 합니까? (0) | 2022.08.29 |
vue-i18n에서 십진수 및 십진수 없이 통화를 표시하려면 어떻게 해야 합니다. (0) | 2022.08.29 |
Vue | vue-modent.js에 관한 문제 (0) | 2022.08.29 |
libc 없는 컴파일 (0) | 2022.08.29 |