【问题标题】:Why can't I cout an endl in a conditional operator? [duplicate]为什么我不能在条件运算符中找到 endl? [复制]
【发布时间】:2019-04-01 18:44:09
【问题描述】:

我正在尝试使用 for 循环打印以逗号分隔的数字列表,但我不希望在最后一个数字之后有逗号,而是希望有一个 endl

我有这个代码:

for (int j = i; j > 0; j--) {
    // Should print 9, 8, 7, 6, 5, 4, 3, 2, 1[endl]
    cout << j << (j > 1 ? ", " : endl);
}

但是,我得到一个编译错误

error: overloaded function with no contextual type information
    cout << j << (j > 1 ? ", " : endl);
                                 ^~~~

我已经包含了 iostream,endl 在程序的其他部分工作正常,将 endl 替换为 "\n" 工作正常...

我只想知道为什么会出现这个错误

【问题讨论】:

  • 三元运算符是一个表达式。表达式必须具有可以在编译时确定的类型,但在您的情况下,类型取决于在运行时发生的比较结果。它可以使用 "\n" 很好地编译,因为无论此比较的结果如何,返回类型都是 const char*。

标签: c++ cout conditional-operator endl


【解决方案1】:

endl 是一个添加\n 然后刷新流的函数,它不是字符串。因此,您不能将它与另一个字符串一起使用在三元组中,因为它们的类型不同。

for (int j = i; j > 1; j--) {
    // Prints 9, 8, 7 ,6, 5, 4, 3, 2, 
    cout << j << ", ";
}
cout << 1 << endl;

当然,你需要处理i小于1的情况。

另一个选项是您的"\n"

【讨论】:

  • 另一个选项是你的 "n"。 应该是像 另一个选项是使用 "\n"[.],是吗?
  • 哦,是的,错字,谢谢!
【解决方案2】:

条件运算符 ?:;只能返回相同的类型。 endl 不是 char* 但 "\n" 是。

【讨论】:

  • 其实”\n”的类型既不是char*类型,也不能转换成这个类型!它是char const[2] 类型,但可以转换为char const*
  • 更准确地说,它的类型是 'const char*' 而不是经典含义的 char 数组。它可以转换为 'char*' 或 void* 或其他东西,但不能在运行时修改。
  • 以上都不是!如果您的编译器允许您将字符串文字转换为char*,则它是不合格的。旧版转换从第一个标准开始就被弃用,并在 C++14 修订版(或 C++17,不完全确定何时)中从 C++ 中删除。 ...并且字符串文字的类型绝对是char const对象的数组!
  • 上面提到的直接转换为const char*,但在编译器C++17中可以这样:void* str = 1 &gt; 0 ? (void*)"ssss" : (void*)"wefqwef";等等。
【解决方案3】:

它们必须具有相同类型。请改用"\n"

for (int j = i; j > 0; j--) {
    // Should print 9, 8, 7, 6, 5, 4, 3, 2, 1[endl]
    cout << j << (j > 1 ? ", " : "\n");
}

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2020-01-27
    • 2011-09-30
    • 2016-06-09
    • 2011-08-19
    • 2015-07-20
    • 2017-09-06
    • 2016-10-30
    相关资源
    最近更新 更多