Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In which case if(a=b) is a good idea? [duplicate]

Tags:

c++

c

Possible Duplicate:
Inadvertent use of = instead of ==

C++ Compilers let your know via warnings that you wrote

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

and that it might be a mistake, that you certainly wanted to write

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

But is there a case where the warning should be ignored because it's a good way to use this "feature"? I don't see any code clarity reason possible so is there a case where its useful?

like image 970
Klaim Avatar asked Jun 26 '10 00:06

Klaim


1 Answers

Two possible reasons:

  1. Assign & Check

    The = operator (when not overriden) normally returns the value that it assigned. This is to allow statements such as a=b=c=3. In the context of your question, it also allows you to do something like this:

    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;
    }
    

    ...which is equivalent to but shorter than:

    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;
    }
    

    Also, it should be noted (as stated by Billy ONeal in a comment below) that this can also work when the left-hand argument of the = operator is actually a class with a conversion operator specified for a type which can be coerced (implicitly converted) to a bool. In other words, (a=b) will evaulate to true or false if a is of a type which can be coerced to a boolean value.

    So the following is a similar situation to the above, except the left-hand argument to = is an object and not a bool:

    #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 
    

    Note: At the time of this writing, the code formatting above is bugged. My code (check the source) actually features proper indenting, shift operators and line spacing. The &lt;'s are supposed to be <'s, and there aren't supposed to be enourmous gaps between each line.

  2. Overridden = operator

    Since C++ allows the overriding of operators, sometimes = will be overriden to do something other than what it does with primitive types. In these cases, the performing the = operation on an object could return a boolean (if that's how the = operator was overridden for that object type).

    So the following code would perform the = operation on a with b as an argument. Then it would conditionally execute some code depending on the return value of that operation:

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

    Here, a would have to be an object and b would be of the correct type as defined by the overriding of the = operator for objects of a's type. To learn more about operator overriding, see this wikipedia article which includes C++ examples: Wikipedia article on operator overriding

like image 93
Cam Avatar answered Sep 28 '22 08:09

Cam