在哪种情况下 if(a=b) 是个好主意?

新手上路,请多包涵

可能重复:

无意中使用 = 而不是 ==

C++ 编译器通过您编写的警告让您知道,

 if( a = b ) { //...

你肯定想写这可能是一个错误:

 if( a == b ) { //...

但是是否存在应该忽略警告的情况,因为这是使用此“功能”的好方法?我看不出有任何代码清晰的原因,那么它是否有用?

原文由 Klaim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 716
2 个回答

两个可能的原因:

  1. 分配和检查

= 运算符(未覆盖时)通常返回它分配的值。这是为了允许诸如 a=b=c=3 类的语句。在您的问题的上下文中,它还允许您执行以下操作:

    bool global;//a global variable

   //a function
   int foo(bool x){

      //assign the value of x to global
      //if x is equal to true, return 4
      if (global=x)
          return 4;

      //otherwise return 3
      return 3;
   }

...相当于但短于:
    bool global;//a global variable

   //a function
   int foo(bool x){

      //assign the value of x to global
      global=x;

      //if x is equal to true, return 4
      if (global==true)
          return 4;

      //otherwise return 3
      return 3;
   }

此外,应注意(如 Billy ONeal 在下面的评论中所述),当 = 运算符的左侧参数实际上是具有为类型指定的 转换运算符 的类时,这也可以工作可以强制(隐式转换)为布尔值。换句话说, (a=b) 将评估为 truefalse 如果 a 是可以强制为布尔值的类型。

因此,以下情况与上述情况类似,除了 = 的左侧参数是对象而不是布尔值:

    #include <iostream>
   using namespace std;

   class Foo {
   public:
       operator bool (){ return true; }
       Foo(){}
   };

   int main(){
       Foo a;
       Foo b;

       if (a=b)
           cout<<"true";
       else
           cout<<"false";
   }

   //output: true

注意: 在撰写本文时,上面的代码格式存在错误。我的代码(检查源代码)实际上具有正确的缩进、移位运算符和行距。 &lt; 应该是 <‘s,并且每行之间不应该有巨大的差距。

  1. = 运算符

由于 C++ 允许覆盖运算符,有时 = 将被覆盖以执行与原始类型不同的操作。在这些情况下,对对象执行 = 操作可能会返回一个布尔值(如果这就是该对象类型的 = 运算符被覆盖的方式)。

因此,以下代码将使用 b 作为参数对 a 执行 = 操作。然后它会根据该操作的返回值有条件地执行一些代码:

    if (a=b){
      //execute some code
   }

在这里, a 必须是一个对象,而 b 将是正确的类型,由 a = 对象的覆盖运算符定义 --- 的类型。要了解有关运算符覆盖的更多信息,请参阅包含 C++ 示例 的维基百科文章:关于运算符覆盖的维基百科文章

原文由 Cam 发布,翻译遵循 CC BY-SA 2.5 许可协议

while ( (line = readNextLine()) != EOF) {
    processLine();
}

原文由 Steven Schlansker 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题