Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C/C++ 삼항 연산자에 대한 몇 가지 흥미로운 관찰

<시간/>

if..else 절 대신 삼항 연산자가 구현된다는 것을 알고 있습니다. ?:로 표시됩니다. '?' 기호는 if 부분과 동일하고 ':'는 else 부분과 동일합니다. 다음 3개의 프로그램은 삼항 연산자의 경우 흥미로운 관찰을 설명합니다.

다음 프로그램은 오류 없이 컴파일할 수 있습니다. 삼항 표현식의 반환 유형은 float(exp2의 반환 유형과 동일)이고 exp3(즉, 리터럴 0 - int 유형)은 암시적으로 float로 변환할 수 있어야 합니다.

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   float fvalue = 3.111f;
   cout<< (test1 ? fvalue : 0) << endl;
   return 0;
}

다음 프로그램은 컴파일할 수 없습니다. 그 이유는 컴파일러가 삼항 표현식의 반환 유형을 찾거나 찾을 수 없거나 exp2(char 배열)와 exp3(int) 간에 암시적 변환을 사용할 수 없기 때문입니다.

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout<< test1 ? "A String" : 0 << endl;
   return 0;
}

다음 프로그램은 컴파일할 수 있지만 런타임에 실패합니다. 삼항 표현식의 리턴 유형은 유형(char *)으로 제한되거나 제한되지만 표현식은 int를 리턴하므로 프로그램이 실패합니다. 리터럴에서 프로그램은 실행 시간 또는 런타임에 0번째 주소의 문자열을 인쇄하려고 합니다.

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout << (test1 ? "A String" : 0) << endl;
   return 0;
}

exp2가 출력 유형으로 처리되고 exp3이 실행 시간 또는 런타임에 exp2로 변환될 수 있음을 관찰할 수 있습니다. 변환이 암시적으로 처리되면 컴파일러는 변환을 위해 스텁을 삽입합니다. 변환이 명시적으로 처리되면 컴파일러에서 오류가 발생합니다. 컴파일러가 이러한 오류를 포착하지 못하는 경우 프로그램이 실행 시간 또는 런타임에 실패할 수 있습니다.