programing

C와 C++의 조건부 연산자 차이

firstcheck 2022. 7. 2. 22:00
반응형

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

반응형