为什么在条件运算符(?:)中,第二和第三个操作数必须具有相同的类型?
我的代码如下:
#include <iostream>
using std::cout;
int main()
{
int a=2, b=3;
cout << ( a>b ? "a is greater\n" : b ); /* expression ONE */
a>b? "a is greater\n" : b; /* expression TWO */
return 0;
}当使用g++编译它时,它会发出一个错误:
main.cpp:7:36: error: operands to ?: have different types ‘const char*’ and ‘int’
main.cpp:8:28: error: operands to ?: have different types ‘const char*’ and ‘int’我不知道他们为什么一定有同样的类型?
(1),如果(a>b)为真,则表达式( a>b ? "a is greater\n" : b )将返回"a is greater\n",cout << "a is greater\n"将输出该字符串;
否则表达式将返回b,cout << b将输出b的值。
但不幸的是,情况并非如此。为什么?
(2)第二个表达式得到相同的错误。
PS:我知道,是标准的人说它必须是这样的,但是,为什么标准会这样说呢?
发布于 2012-03-12 05:03:16
你应该试着分解正在发生的事情来理解:
cout << ( a>b ? "a is greater\n" : b );这意味着:
operator<<(cout, ( a>b ? "a is greater\n" : b ));在此阶段,编译器必须选择下列重载之一:
ostream& operator<<(ostream&, int);
ostream& operator<<(ostream&, const char*);但它不能这样做,因为三元操作符的结果类型尚不清楚(仅在运行时)。
为了让事情变得更清楚,你可以这样想:
auto c = a>b ? "test" : 0;c的类型是什么?它不能在编译时决定。C++是一种静态类型语言。所有类型都必须在编译时知道。
编辑:
您对a ? b : c的思考方式如下:
if (a)
b;
else
c;其实是这样的:
if (a)
return b;
else
return c;发布于 2012-03-12 05:03:03
我想知道为什么他们必须有相同的类型?
在C++中,任何表达式都必须有一个类型,编译器应该能够在编译时推断它。
这源于这样一个事实,即C++是一种静态类型语言,在编译时必须知道所有类型。
发布于 2012-03-12 05:04:46
他们不一定非得是同一类型的。例如,像:int a = argc > 1 ? 2 : 'a';这样的表达式是完全允许的,尽管2是int类型,'a'是char类型。
但是,确实必须有向同一类型的隐式转换。原因很简单:操作符必须生成一个值,而编译器必须能够计算出该值的类型。如果这两种类型之间没有隐式转换,那么表达式就不会产生一种类型。
https://stackoverflow.com/questions/9661952
复制相似问题