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?
Two possible reasons:
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 <
's are supposed to be <'s, and there aren't supposed to be enourmous gaps between each line.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With