具有混合数据类型的条件运算符?
Conditional operator with mixed data types?
条件运算符不能处理混合数据类型,因此:
bool cond = true;
cout << (cond?1:2) << endl;
cout << (cond?"msg1":"msg2") << endl;
cout << (cond?1:"msg") << endl;
在最后一行,我收到此错误消息:
error: incompatible operand types ('int' and 'const char *')
有没有办法使用一行代码在这样的语句中混合不同的类型?我需要把它放在预处理器宏中。
编译器:clang 3.5
问题在于 ? : 运算符导致赋值操作,因此它只能将值分配给单个类型,并且在编译时无法确定应使用哪种类型,因为代码分支就像使用 if 语句一样。想象一种方法,在一种情况下 returns 是一个字符串,在另一种情况下是一个 int,这是不可能的。您可以做的是,您可以按照来自莫斯科的@Vlad 所建议的那样来平衡类型。
对于最后一个语句,您可以确定常见类型,如 std::string
。
例如
std::cout << ( cond ? std::to_string( 1 ) : "msg" ) << std::endl;
<< 运算符针对不同的数据类型进行了重载,并且在编译代码时,编译器会确定要调用的重载函数。这就是为什么您不能拥有 return 不同可能数据类型的函数:编译器无法以这种方式选择正确的重载。
因此,将 (cond ? result1 : result2) 视为一个函数,它只需要一个 return 类型,就像任何其他函数一样。
如果你能更清楚地说明你到底想做什么,可能会更容易帮助你!
干杯
声明(cond?1:"msg")
在编译过程中它自己会导致失败。
让a = (cond?1:"msg")
编译器会将此表达式翻译成类似于
if cond then
a = 1
else
a ="msg"
正如我们所见,分配给 a
的值类型从 if 更改为 else。
但是,如果您使用的是支持类型更改的动态语言,那么它将是有效的。
所以你应该使用
cout<<(cond?std::to_string( 1 ):"msg");
条件运算符不能处理混合数据类型,因此:
bool cond = true;
cout << (cond?1:2) << endl;
cout << (cond?"msg1":"msg2") << endl;
cout << (cond?1:"msg") << endl;
在最后一行,我收到此错误消息:
error: incompatible operand types ('int' and 'const char *')
有没有办法使用一行代码在这样的语句中混合不同的类型?我需要把它放在预处理器宏中。
编译器:clang 3.5
问题在于 ? : 运算符导致赋值操作,因此它只能将值分配给单个类型,并且在编译时无法确定应使用哪种类型,因为代码分支就像使用 if 语句一样。想象一种方法,在一种情况下 returns 是一个字符串,在另一种情况下是一个 int,这是不可能的。您可以做的是,您可以按照来自莫斯科的@Vlad 所建议的那样来平衡类型。
对于最后一个语句,您可以确定常见类型,如 std::string
。
例如
std::cout << ( cond ? std::to_string( 1 ) : "msg" ) << std::endl;
<< 运算符针对不同的数据类型进行了重载,并且在编译代码时,编译器会确定要调用的重载函数。这就是为什么您不能拥有 return 不同可能数据类型的函数:编译器无法以这种方式选择正确的重载。
因此,将 (cond ? result1 : result2) 视为一个函数,它只需要一个 return 类型,就像任何其他函数一样。
如果你能更清楚地说明你到底想做什么,可能会更容易帮助你!
干杯
声明(cond?1:"msg")
在编译过程中它自己会导致失败。
让a = (cond?1:"msg")
编译器会将此表达式翻译成类似于
if cond then
a = 1
else
a ="msg"
正如我们所见,分配给 a
的值类型从 if 更改为 else。
但是,如果您使用的是支持类型更改的动态语言,那么它将是有效的。
所以你应该使用
cout<<(cond?std::to_string( 1 ):"msg");