gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:23:21 30 4
gpt4 key购买 nike

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

我的代码是这样的:

#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:我知道,是标准说一定要这样,但是,为什么标准这么说呢?

最佳答案

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

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;

关于c++ - 为什么在条件运算符 (?:), 第二和第三个操作数必须具有相同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661952/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com