三元运算符编译

时间:2019-01-03 08:59:02

标签: c++

为什么这会导致以粗体显示编译问题?

const list = async function(end_cursor) {
  if (!end_cursor) {
    return await db.discovery.where('_id').sort({ _id: -1 }).limit(50);
  }
  return await db.discovery.where('_id').lt(end_cursor).sort({ _id: -1 }).limit(50);
}

编译消息:

#include<iostream>

static int i = 10; 

int main() {
  **(i) ? (std::cout << "First i = " << i << std::endl) : ( i = 10);**
  std::cout << "Second i = " << i << std::endl;
}

2 个答案:

答案 0 :(得分:3)

您对三元运算符的使用有点奇怪:基于i的值,您可以将内容打印到std::cout或为其分配一个新值。这些动作不会通过表达式的返回值共享连接,因此请不要这样。使用三元运算符时,最好使其更接近其预期的目的:使用一个基于简单谓词的分派对两个可能的表达式进行简短表示。示例:

const int n = i == 0 ? 42 : 43;

您的代码应如下所示:

if (i == 0)
   i = 10;
else
   std::cout << "First i = " << i << "\n";

原始代码段未编译的原因是没有三元运算符的公共返回类型。 “公共”表示两个表达式都可以转换为返回类型。例如,在const int n = i == 0 ? 42 : 43;中,返回类型为int

答案 1 :(得分:1)

问题出在以下事实:条件运算符(三元运算符)中的表达式的返回值(对于std::ofstreamstd::cout ...和{ int的{​​1}}不兼容,因此条件运算符的格式不正确。请检查条件运算符的the rules for return type

在这种情况下,只需使用常规条件即可:

i = 10