首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在条件运算符(?:)中,第二和第三个操作数必须具有相同的类型?

为什么在条件运算符(?:)中,第二和第三个操作数必须具有相同的类型?
EN

Stack Overflow用户
提问于 2012-03-12 04:57:47
回答 5查看 11.5K关注 0票数 22

为什么在条件运算符(?:)中,第二和第三个操作数必须具有相同的类型?

我的代码如下:

代码语言:javascript
复制
#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++编译它时,它会发出一个错误:

代码语言:javascript
复制
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"将输出该字符串;

否则表达式将返回bcout << b将输出b的值。

但不幸的是,情况并非如此。为什么?

(2)第二个表达式得到相同的错误。

PS:我知道,是标准的人说它必须是这样的,但是,为什么标准会这样说呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-12 05:03:16

你应该试着分解正在发生的事情来理解:

代码语言:javascript
复制
cout << ( a>b ? "a is greater\n" : b );

这意味着:

代码语言:javascript
复制
operator<<(cout, ( a>b ? "a is greater\n" : b ));

在此阶段,编译器必须选择下列重载之一:

代码语言:javascript
复制
ostream& operator<<(ostream&, int);
ostream& operator<<(ostream&, const char*);

但它不能这样做,因为三元操作符的结果类型尚不清楚(仅在运行时)。

为了让事情变得更清楚,你可以这样想:

代码语言:javascript
复制
 auto c = a>b ? "test" : 0;

c的类型是什么?它不能在编译时决定。C++是一种静态类型语言。所有类型都必须在编译时知道。

编辑:

您对a ? b : c的思考方式如下:

代码语言:javascript
复制
if (a)
    b;
else
    c;

其实是这样的:

代码语言:javascript
复制
if (a)
    return b;
else
    return c;
票数 38
EN

Stack Overflow用户

发布于 2012-03-12 05:03:03

我想知道为什么他们必须有相同的类型?

在C++中,任何表达式都必须有一个类型,编译器应该能够在编译时推断它。

这源于这样一个事实,即C++是一种静态类型语言,在编译时必须知道所有类型。

票数 6
EN

Stack Overflow用户

发布于 2012-03-12 05:04:46

他们不一定非得是同一类型的。例如,像:int a = argc > 1 ? 2 : 'a';这样的表达式是完全允许的,尽管2int类型,'a'char类型。

但是,确实必须有向同一类型的隐式转换。原因很简单:操作符必须生成一个值,而编译器必须能够计算出该值的类型。如果这两种类型之间没有隐式转换,那么表达式就不会产生一种类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9661952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档