【问题标题】:'==' operator not found'==' 运算符未找到
【发布时间】:2015-07-15 10:03:59
【问题描述】:

所以显然这个程序不起作用。软件告诉我缺少“==”运算符。有人能告诉我该怎么做,并解释为什么他/她的解决方案有效吗?

#include <iostream>
using namespace std;

int main() {

    int var{ 0 };

    cout << "Bitte eine Ganzzahl eingeben: ";
    if ((cin >> var) == false) {
        cerr << "Falsche Eingabe - Keine Zahl\n";
        exit(1);
    }


    system("pause");
    //return 0;
}

当我们在做的时候。为什么可以在 if 语句中执行“cin”?我会在 if 语句之前使用 'cin'。

【问题讨论】:

  • 这个compiles and runs 对我来说很好。
  • @MooseBoys 它仅在 C++11 之前编译,因为它将使用 void*bool 隐式转换。
  • @MooseBoys:它将适用于过时的标准库(其中流转换为指针类型而不是 bool),但不是现代标准库(显式转换为 bool) .
  • 显然 IDEOne 不兼容 - 它设置为 C++14 模式并且仍然有效。果然 cl.exe 抱怨了。
  • 第一句意思是:输入一个整数。第二个意思是:输入错误。我不认为这应该是相关的,

标签: c++ if-statement operator-keyword


【解决方案1】:

首先cin不是你执行的东西,就像其他一些语言的print命令一样。它是 istream 类的一个对象,表示字符的标准输入流。

运算符&gt;&gt; 从此类流中提取格式化输入。它的原型类似于

istream& operator>> (int& val);

意味着它返回对 istream 本身的引用,因此您可以像这样链接操作

cin >> foo >> bar;

因此您无法将作为引用的cin &gt;&gt; foo 的结果与常量false 进行比较。

另一方面,运算符“!”被重载了,和fail的意思一样,所以你可以像这样检查一个操作是否成功

if ( ! (cin >> var) ) {
   cerr << "something is going wrong" << endl;
}

【讨论】:

    【解决方案2】:

    std::istream 具有到bool 的转换运算符,但它必须是显式的 (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool):

    explicit operator bool() const;
    

    您可以使用显式转换运算符:

    if ( (bool)(cin >> var) == false) {
        cerr << "Falsche Eingabe - Keine Zahl\n";
    }
    

    或简单地使用:

    if ( !(cin >> var) ) {
        cerr << "Falsche Eingabe - Keine Zahl\n";
    }
    

    【讨论】:

      【解决方案3】:

      在现代 C++ 中,可以使用 explicit operator bool 测试流的状态。这意味着它可以直接用作if 语句中的条件,但不能隐式转换为bool 以与false 进行比较。所以你需要更惯用的

      if (cin >> var)
      

      测试状态。

      为什么可以在if语句中执行'cin'?

      因为条件可以是任何表达式,只要它有可以转换为bool的结果即可。 &gt;&gt; 运算符返回对流的引用,可以通过我上面描述的运算符进行转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多