C와 C++의 조건부 연산자 차이
어디선가 읽었는데?:
C의 연산자는 C++에서 약간 다르며, 두 언어 모두 다르게 작동하는 소스 코드가 있습니다.공교롭게도 어디에서도 본문을 찾을 수 없습니다.이 차이가 뭔지 아는 사람?
C++의 조건부 연산자는 l값을 반환할 수 있지만 C는 유사한 기능을 허용하지 않습니다.따라서 C++ 에서는 다음 사항이 유효합니다.
(true ? a : b) = 1;
이를 C에서 복제하려면 if/else에 의존하거나 참조를 직접 처리해야 합니다.
*(true ? &a : &b) = 1;
C++에서도?:
그리고.=
연산자는 다음과 같이 우선순위가 같고 그룹이 오른쪽에서 왼쪽으로 되어 있습니다.
(true ? a = 1 : b = 2);
는 유효한 C++ 코드입니다만, 마지막 식 주위에 괄호를 넣지 않고, C 에 에 에러를 발생시킵니다.
(true ? a = 1 : (b = 2));
주된 실질적인 차이는 C++에서와 같이 ?:의 평가는 l-값이 될 수 없다는 것입니다.
그 정의에는 실질적인 결과가 거의 없는 다른 차이점이 있다.C++에서는 첫 번째 피연산자가 Bool로 변환되고, C에서는 0과 비교됩니다.이는 C와 C++ 사이의 ==, != 등의 정의 차이와 관련이 있다.
C++에는 두 번째 및 세 번째 오퍼랜드의 유형을 기반으로 ?: 식의 유형을 추론하기 위한 더 복잡한 규칙도 있습니다.이는 C++에서 사용자 정의 암묵적 변환 가능성을 반영합니다.
코드 예시유효한 C++, 유효하지 않은 C.
extern int h(int p, int q);
int g(int x)
{
int a = 3, b = 5;
(x ? a : b) = 7;
return h( a, b );
}
gcc
는 C로 컴파일할 때 "error: in assignment"라는 오류를 발생시키지만 C++로 컴파일할 때 코드는 오류 없이 컴파일됩니다.
편집: C의 l-값을 반환할 수 없지만, 의외로?:의 문법은 다음과 같습니다.
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
즉,a ? b : c = d
라고 해석하다(a ? b : c) = d
('l-value가 아님' 규칙으로 인해) 유효한 식을 얻을 수 없습니다.
C++는 문법을 다음과 같이 변경합니다.
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
조건식이 l-값이 될 수 있도록 하는 확장이 어떤 상황에서는a ? b : c = d
문법 변경 없이 유효하다, 새로운 문법 변경은 그 표현이 현재 유효하지만 다른 의미를 갖는다는 것을 의미한다.a ? b : (c = d)
.
이에 대한 증거는 없지만, 문법 변경이 기존 C 코드와의 호환성을 깨뜨릴 수 없기 때문에, 새로운 문법이 다음과 같은 표현으로 놀라움을 덜 줄 것이라고 추측했습니다.
make_zero ? z = 0 : z = 1;
언급URL : https://stackoverflow.com/questions/1082655/conditional-operator-differences-between-c-and-c
'programing' 카테고리의 다른 글
Java 클래스 파일을 "컴파일 해제"하려면 어떻게 해야 합니까? (0) | 2022.07.02 |
---|---|
단일 요소 배열 목록을 빠르고 편리하게 작성하는 방법 (0) | 2022.07.02 |
vue j에 대한 응답형 이미지 그리드 갤러리 (0) | 2022.07.02 |
Vue.js 2.3 - Element UI 대화상자 - 동기 및 소품 (0) | 2022.07.02 |
Vue-router를 사용하면 단순히 경로를 직접 사용하는 것보다 이름 있는 경로를 사용하는 것이 더 좋은 점이 있습니까? (0) | 2022.07.02 |