关于C / C ++三元运算符的一些有趣观察

我们知道实现了三元运算符,而不是if..else子句。用?:表示。'?' symbol等于if part,':'等于else part。以下3个程序解释了三元运算符的一些有趣观察。

以下程序可以正确编译。三元表达式的返回类型应为float(与exp2一样),而exp3(即字面零-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。如果将转换视为隐式转换,则编译器将插入存根进行转换。如果将转换视为显式转换,则编译器将引发错误。如果有任何编译器能够丢失以捕获此类错误,则该程序可能会在执行时或运行时失败。